SpringBoot+Shiro学习(二):逻辑介绍
2018-08-23 本文已影响13人
Hiwayz
我们先写一个简单的登录认证。
//创建一个默认SecurityManager
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
//创建一个自定义Realm对象
CustomRealm realm = new CustomRealm();
//将自定义Realm注入到SecurityManager里
defaultSecurityManager.setRealm(realm);
//创建加密Matcher,加密方式为md5,加密次数1
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
matcher.setHashAlgorithmName("md5");
matcher.setHashIterations(1);
//注入到Realm中,这样在验证的时候,会把token传进去的密码自动加密
realm.setCredentialsMatcher(matcher);
//获取Subject
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
//设置Token
AuthenticationToken token = new UsernamePasswordToken("Hiway","123456");
//登录验证
subject.login(token);
//是否成功验证
System.out.println("isAuthentication:"+subject.isAuthenticated());
//是否拥有角色
subject.checkRoles("admin");
//是否拥有权限
subject.checkPermission("user:delete");
//登出
subject.logou();
- 从上可以看出,我们先是创建了一个SecurityManager,然后创建自定义Realm,将Realm注入。自定义Realm,这个我们下一节再讲,现在先可以把他理解为Shiro验证和授权的逻辑模块,通过把创建的Subject传入的数据,然后通过Realm来判断是否成功验证或授权。
- 接下来是加密模块,这个比较简单就不再做叙说。
- 接着获取SecurityManager并绑定到SecurityUtils,这是一个全局设置,设置一次即可;
- 通过SecurityUtils得到Subject,其会自动绑定到当前线程;然后获取身份验证的Token,如用户名/密码;
- 调用subject.login方法进行登录,其会自动委托给SecurityManager.login方法进行登录;
- 如果身份验证失败请捕获AuthenticationException或其子类,常见的如: DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如“用户名/密码错误”而不是“用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;
7.subject的一系列方法
8.最后可以调用subject.logout退出,其会自动委托给SecurityManager.logout方法退出。
AuthenticationToken
AuthenticationToken用于收集用户提交的身份(如用户名)及凭据(如密码):
public interface AuthenticationToken extends Serializable {
Object getPrincipal(); //身份
Object getCredentials(); //凭据
}
扩展接口RememberMeAuthenticationToken:提供了“boolean isRememberMe()”现“记住我”的功能;
扩展接口是HostAuthenticationToken:提供了“String getHost()”方法用于获取用户“主机”的功能。
Shiro提供了一个直接拿来用的UsernamePasswordToken,用于实现用户名/密码Token组,另外其实现了RememberMeAuthenticationToken和HostAuthenticationToken,可以实现记住我及主机验证的支持。