摘要:通常在根據進行身份驗證時一般進行以下三步利用一個用戶的用戶名和密碼綁定到服務器。這里使用來簡化操作用戶名不存在拋出異常用戶被管理員鎖定拋出異常角色加入認證對象權限加入認證對象關鍵的代碼如下,驗證用戶和獲取用戶信息的配置如下
通常在根據LDAP進行身份驗證時一般進行以下三步:
利用一個LDAP用戶的用戶名和密碼綁定到LDAP服務器。
在LDAP中檢索一個用戶的條目,然后將提供的密碼和檢索到的LDAP記錄中進行驗證。
根據LDAP提供的記錄,再去本系統中查找授權信息。
Shiro 提供了DefaultLdapRealm,只做了第二步,根據用戶的條目和密碼來驗證。并不能滿足我們的需求,所以肯定是要定制化LdapRealm。
這里使用Spring Ldap 來簡化Ldap操作
public class LdapRealm extends AuthorizingRealm { private static final Logger logger = LoggerFactory.getLogger(LdapRealm.class); private LdapTemplate ldapTemplate; @Autowired private UserService userService; @Autowired private RoleService roleService; @Autowired private MenuService menuService; @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); String password = new String((char[]) token.getCredentials()); try { LdapQuery ldapQuery = LdapQueryBuilder.query().base("DC=example,DC=com").searchScope(SearchScope.SUBTREE) .filter("(sAMAccountName={0})", username); boolean authResult = ldapTemplate.authenticate(ldapQuery.base(), ldapQuery.filter().encode(), password); if (!authResult) { logger.debug("ldap authentication for {} failed", username); return null; } User ldapUser = (User) ldapTemplate.searchForObject(ldapQuery, new LdapUserAttrMapper()); User user = userService.selectUserById(ldapUser.getUserId()); if (user == null) { // 用戶名不存在拋出異常 throw new UnknownAccountException(); } if (user.getRemoveFlag()) { // 用戶被管理員鎖定拋出異常 throw new LockedAccountException(); } SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, token.getCredentials(), "LdapRealm"); return authenticationInfo; } catch (Exception e) { logger.error("ldap authentication failed", e.toString()); return null; } } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { Long userId = ShiroUtils.getUserId(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 角色加入AuthorizationInfo認證對象 info.setRoles(roleService.selectRoleKeys(userId)); // 權限加入AuthorizationInfo認證對象 info.setStringPermissions(menuService.selectPermsByUserId(userId)); return info; } public LdapTemplate getLdapTemplate() { return ldapTemplate; } public void setLdapTemplate(LdapTemplate ldapTemplate) { this.ldapTemplate = ldapTemplate; } }
關鍵的代碼如下,驗證用戶和獲取LDAP用戶信息
LdapQuery ldapQuery = LdapQueryBuilder.query().base("DC=example,DC=com").searchScope(SearchScope.SUBTREE) .filter("(sAMAccountName={0})", username); boolean authResult = ldapTemplate.authenticate(ldapQuery.base(), ldapQuery.filter().encode(), password); User ldapUser = (User) ldapTemplate.searchForObject(ldapQuery, new LdapUserAttrMapper());
Spring 的 ldap 配置如下:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74274.html
摘要:的很容易反映出常見的工作流程。權限檢查是執行授權的另一種方式。在安全框架領域提供了一些獨特的東西一致的會話,可用于任何應用程序和任何架構層。 Apache Shiro?是一個功能強大且易于使用的Java安全框架,可執行身份驗證,授權,加密和會話管理。借助Shiro易于理解的API,可以快速輕松地保護任何應用程序 - 從最小的移動應用程序到最大的Web和企業應用程序。 1. Apache S...
摘要:框架提供的接口,是的核心,代表安全管理器對象。可以開發人員編寫,框架也提供一些。在中作為應用程序和安全數據之間的橋梁或連接器。例如要求中必須同時含有和的權限才能執行方法。 apache shiro框架簡介 Apache Shiro是一個強大而靈活的開源安全框架,它能夠干凈利落地處理身份認證,授權,企業會話管理和加密。現在,使用Apache Shiro的人越來越多,因為它相當簡單,相比比Sp...
摘要:寫在前面在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。 寫在前面 在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。但是,一方面,不同的應用對于數據的合法性和可見性要求的維度與粒度都有所區別;另一方面,以當前微服務、多服務的架構方式,如何共享Sessi...
摘要:安全框架是目前為止作為登錄注冊最常用的框架,因為它十分的強大簡單,提供了認證授權加密和會話管理等功能。本質上是一個特定安全的。當配置時,必須指定至少一個用來進行身份驗證和或授權。提供了多種可用的來獲取安全相關的數據。 web開發安全框架中的Apache Shiro的應用前階段就hadoop的分享了一些內容,希望對新手入門的朋友有點幫助吧!對于hadoop新手入門的,還是比較推薦大快搜索...
閱讀 1525·2023-04-26 00:25
閱讀 918·2021-09-27 13:36
閱讀 933·2019-08-30 14:14
閱讀 2177·2019-08-29 17:10
閱讀 1015·2019-08-29 15:09
閱讀 1950·2019-08-28 18:21
閱讀 970·2019-08-26 13:27
閱讀 977·2019-08-26 10:58