shiro认证机制,认证原理
下文笔者将讲述shiro的认证机制及认证原理,如下所示:
Shiro认证: 验证用户身份的过程 在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法 如:“用户名/密码”组合
shiro认证原理
1、首先应用程序构建了一个终端用户认证信息的AuthenticationToken 然后运行Subject.login方法 2、Sbuject的实例通常是DelegatingSubject类(或子类)的实例对象 在认证开始时,会委托应用程序设置的securityManager实例调用securityManager.login(token)方法 3、SecurityManager接受到token(令牌)信息后会委托内置的Authenticator的实例(通常都是ModularRealmAuthenticator类的实例) 调用authenticator.authenticate(token). ModularRealmAuthenticator在认证过程中会对设置的一个或多个Realm实例进行适配 它实际上为Shiro提供了一个可拔插的认证机制 4、当在应用程序中配置了多个Realm ModularRealmAuthenticator会根据配置的AuthenticationStrategy(认证策略)来进行多Realm的认证过程 当Realm被调用后,AuthenticationStrategy将对每一个Realm的结果作出响应 注:如果应用程序中仅配置了一个Realm,Realm将被直接调用而无需再配置认证策略 5、判断每一个Realm是否支持提交的token 如果支持,Realm将调用getAuthenticationInfo(token); getAuthenticationInfo方法就是实际认证处理,我们通过覆盖Realm的doGetAuthenticationInfo方法来编写我们自定义的认证处理
Shiro认证过程
收集实体/凭据信息
//用户名 密码校验 UsernamePasswordToken?token?=?new?UsernamePasswordToken(username,?password); //开启"记得我"功能 token.setRememberMe(true); UsernamePasswordToken支持最常见的用户名/密码的认证机制 同时,由于它实现了RememberMeAuthenticationToken接口 我们可以通过令牌设置“记住我”的功能,已记住的用户仅仅是非匿名用户 你可以通过subject.getPrincipals()获取用户信息。但是它并非是完全认证通过的用户 当你访问需要认证用户的功能时,你仍然需要重新提交认证信息 2、提交实体/凭据信息 Subject currentUser = SecurityUtils.getSubject(); currentUser.login(token); 收集了实体/凭据信息之后,我们可以通过SecurityUtils工具类,获取当前的用户,然后通过调用login方法提交认证。 3、认证处理 try{ currentUser.login(token); }catch(UnknownAccountException?uae?){ }catch(AuthenticationException?ae?){//error } 如果login方法执行完毕且没有抛出任何异常信息,那么便认为用户认证通过。之后在应用程序任意地方调用SecurityUtils.getSubject() 都可以获取到当前认证通过的用户实例,使用subject.isAuthenticated()判断用户是否已验证都将返回true.? 至此shiro的验证通过了
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。