<dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> |
[users] test=test |
package test.mylo; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; public class TestShiro { public static void main(String[] args) { //加载配置文件 IniSecurityManagerFactory ini = new IniSecurityManagerFactory("classpath:shiro.ini"); //获取securityManagers实例对象 SecurityManager securityManager = ini.getInstance(); //获取 SecurityManager 并绑定到 SecurityUtils SecurityUtils.setSecurityManager(securityManager); //获取当前主体对象 Subject subject = SecurityUtils.getSubject(); //设置当前的TOKEN UsernamePasswordToken token = new UsernamePasswordToken("test", "test1"); try { subject.login(token); System.out.println("验证成功"); } catch (AuthenticationException e) { //验证失败 e.printStackTrace(); System.out.println("验证失败"); } } } [size=14.0000pt] |
首先通过 new IniSecurityManagerFactory 并指定一个 ini 配置文件来创建一个 SecurityManager 工厂; 接着获取 SecurityManager 并绑定到 SecurityUtils,这是一个全局设置,设置一次即可; 通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程;如果在 web 环境在请求结束时需要解除绑定然后获取身份验证的 Token,如用户名 / 密码; 调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录; 如果身份验证失败请捕获 AuthenticationException 或其子类,常见的如: DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如 “用户名 / 密码错误” 而不是 “用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库; |
1. 首先调用 Subject.login(token) 进行登录,其会自动委托给 Security Manager,调用之前必须通过 SecurityUtils.setSecurityManager() 设置; 2. SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证; 3. Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现; 4. Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认 ModularRealmAuthenticator 会调用 AuthenticationStrategy 进行多 Realm 身份验证; 5.Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回 / 抛出异常表示身份验证失败了。此处可以配置多个 Realm,将按照相应的顺序及策略进行访问。 |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |