Shiro的登录拦截和用户认证
登录拦截需要使用ShiroFilterFactoryBean的setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap)来进行对我们输入的map进行拦截。其中key就是需要拦截的对象,value是拦截的处理方式。所以登录拦截非常简单只需要在我们添加的组件里面增加一些简单的方法就可以了。
用户认证也非常简单。我们使用的也是ShiroFilterFactoryBean也就是用户,需要执行方法login,而login方法会进入到Realm里面重写的认证方法doGetAuthenticationInfo,里面对用户名和密码进行验证。需要把AuthenticationToken令牌转换成UsernamePasswordToken,来对用户的账号和密码验证,但是我们手动验证的是账号,密码是不能验证的,框架会帮我们验证,我们只需要传入正确的密码就可以了,他就会通过比对来得出结论。需要注意这里的pricipal其实就相当于是username这些身份验证的属性。第二点就是AuthorizingRealm其实就是用来检查授权和认证的一个类,我们可以通过继承这个类来自定义两个检查方法来确定我们自己的检查定义。
代码(ShiroConfig)
@Configuration
public class ShiroConfig {
//需要bean用户
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager);
// 设置内置的过滤器,拦截
Map<String, String> filterChainDefinitionMap=new HashMap<>();
/*
authc认证后才能登录
anno无需认证
user:必须拥有记住我的功能才能使用
perms:拥有某个资源的权限才能访问
role:拥有某个角色才能访问
*/
// 这里使用了aop,给过滤器加上拦截这几个请求,需要经过认证,通过cookie来确定是否认证成功
filterChainDefinitionMap.put("/add","authc");
filterChainDefinitionMap.put("/update","authc");
bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
bean.setLoginUrl("/toLogin");
return bean;
}
//需要用户管理
@Bean(name="securityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
securityManager.setRealm(userRealm);
return securityManager;
}
//需要数据连接
@Bean(name="userRealm")
public UserRealm userRealm(){
return new UserRealm();
}
}
代码(Realm)
public class UserRealm extends AuthorizingRealm {
//横切的认证和授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("我是授权");
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("我是认证");
String username="root";
String password="123456";
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
if(!username.equals(token.getUsername())){
return null;
}
return new SimpleAuthenticationInfo("",password,"");
}
}