摘要:通常在根據(jù)進(jìn)行身份驗(yàn)證時(shí)一般進(jìn)行以下三步利用一個(gè)用戶(hù)的用戶(hù)名和密碼綁定到服務(wù)器。這里使用來(lái)簡(jiǎn)化操作用戶(hù)名不存在拋出異常用戶(hù)被管理員鎖定拋出異常角色加入認(rèn)證對(duì)象權(quán)限加入認(rèn)證對(duì)象關(guān)鍵的代碼如下,驗(yàn)證用戶(hù)和獲取用戶(hù)信息的配置如下
通常在根據(jù)LDAP進(jìn)行身份驗(yàn)證時(shí)一般進(jìn)行以下三步:
利用一個(gè)LDAP用戶(hù)的用戶(hù)名和密碼綁定到LDAP服務(wù)器。
在LDAP中檢索一個(gè)用戶(hù)的條目,然后將提供的密碼和檢索到的LDAP記錄中進(jìn)行驗(yàn)證。
根據(jù)LDAP提供的記錄,再去本系統(tǒng)中查找授權(quán)信息。
Shiro 提供了DefaultLdapRealm,只做了第二步,根據(jù)用戶(hù)的條目和密碼來(lái)驗(yàn)證。并不能滿(mǎn)足我們的需求,所以肯定是要定制化LdapRealm。
這里使用Spring Ldap 來(lái)簡(jiǎn)化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) { // 用戶(hù)名不存在拋出異常 throw new UnknownAccountException(); } if (user.getRemoveFlag()) { // 用戶(hù)被管理員鎖定拋出異常 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認(rèn)證對(duì)象 info.setRoles(roleService.selectRoleKeys(userId)); // 權(quán)限加入AuthorizationInfo認(rèn)證對(duì)象 info.setStringPermissions(menuService.selectPermsByUserId(userId)); return info; } public LdapTemplate getLdapTemplate() { return ldapTemplate; } public void setLdapTemplate(LdapTemplate ldapTemplate) { this.ldapTemplate = ldapTemplate; } }
關(guān)鍵的代碼如下,驗(yàn)證用戶(hù)和獲取LDAP用戶(hù)信息
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 配置如下:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74274.html
摘要:的很容易反映出常見(jiàn)的工作流程。權(quán)限檢查是執(zhí)行授權(quán)的另一種方式。在安全框架領(lǐng)域提供了一些獨(dú)特的東西一致的會(huì)話(huà),可用于任何應(yīng)用程序和任何架構(gòu)層。 Apache Shiro?是一個(gè)功能強(qiáng)大且易于使用的Java安全框架,可執(zhí)行身份驗(yàn)證,授權(quán),加密和會(huì)話(huà)管理。借助Shiro易于理解的API,可以快速輕松地保護(hù)任何應(yīng)用程序 - 從最小的移動(dòng)應(yīng)用程序到最大的Web和企業(yè)應(yīng)用程序。 1. Apache S...
摘要:框架提供的接口,是的核心,代表安全管理器對(duì)象??梢蚤_(kāi)發(fā)人員編寫(xiě),框架也提供一些。在中作為應(yīng)用程序和安全數(shù)據(jù)之間的橋梁或連接器。例如要求中必須同時(shí)含有和的權(quán)限才能執(zhí)行方法?!pache shiro框架簡(jiǎn)介 Apache Shiro是一個(gè)強(qiáng)大而靈活的開(kāi)源安全框架,它能夠干凈利落地處理身份認(rèn)證,授權(quán),企業(yè)會(huì)話(huà)管理和加密?,F(xiàn)在,使用Apache Shiro的人越來(lái)越多,因?yàn)樗喈?dāng)簡(jiǎn)單,相比比Sp...
摘要:寫(xiě)在前面在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問(wèn)題。用戶(hù)的合法性與數(shù)據(jù)的可見(jiàn)性是數(shù)據(jù)安全中非常重要的一部分。 寫(xiě)在前面 在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問(wèn)題。用戶(hù)的合法性與數(shù)據(jù)的可見(jiàn)性是數(shù)據(jù)安全中非常重要的一部分。但是,一方面,不同的應(yīng)用對(duì)于數(shù)據(jù)的合法性和可見(jiàn)性要求的維度與粒度都有所區(qū)別;另一方面,以當(dāng)前微服務(wù)、多服務(wù)的架構(gòu)方式,如何共享Sessi...
摘要:安全框架是目前為止作為登錄注冊(cè)最常用的框架,因?yàn)樗值膹?qiáng)大簡(jiǎn)單,提供了認(rèn)證授權(quán)加密和會(huì)話(huà)管理等功能。本質(zhì)上是一個(gè)特定安全的。當(dāng)配置時(shí),必須指定至少一個(gè)用來(lái)進(jìn)行身份驗(yàn)證和或授權(quán)。提供了多種可用的來(lái)獲取安全相關(guān)的數(shù)據(jù)。 web開(kāi)發(fā)安全框架中的Apache Shiro的應(yīng)用前階段就hadoop的分享了一些內(nèi)容,希望對(duì)新手入門(mén)的朋友有點(diǎn)幫助吧!對(duì)于hadoop新手入門(mén)的,還是比較推薦大快搜索...
摘要:當(dāng)前可以是身份,不需要經(jīng)過(guò)認(rèn)證或者在原先的中存在記錄。當(dāng)前必須擁有所有指定的角色時(shí),才能訪(fǎng)問(wèn)被該注解標(biāo)注的方法。 關(guān)于 Apache Shiro 概念基本都粘自官網(wǎng) http://shiro.apache.org/詳細(xì)中文博客 http://wiki.jikexueyuan.com/p...與SpringBoot整合 https://segmentfault.com/a/11... ...
閱讀 1537·2023-04-26 00:25
閱讀 923·2021-09-27 13:36
閱讀 934·2019-08-30 14:14
閱讀 2184·2019-08-29 17:10
閱讀 1018·2019-08-29 15:09
閱讀 1953·2019-08-28 18:21
閱讀 971·2019-08-26 13:27
閱讀 984·2019-08-26 10:58