Shiro请求授权实现
请求授权的关键方法是realm下面的doGetAuthorizationInfo,每次我们需要授权时候都需要经过这一个方法。我们也需要在
ShiroFilterFactoryBean下面设置好进入什么链接需要什么样的权限filterChainDefinitionMap.put("/add",“perms[user:add]”);在授权我们需要用到一些pricipal,而这些pricipal通常会存储在subject上面,我们可以通过SecurityUtils,来获得subject,原因是SecurityUtils里面是有SecurityManager用户管理器,我们可以通过用户管理器获取用户并且进行对用户所有拥有的权限进行检验。
代码(UserReaml)
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService service;
//横切的认证和授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("我是授权");
Subject subject = SecurityUtils.getSubject();
User principal = (User) subject.getPrincipal();
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
// 给user授权
info.addStringPermission(principal.getPerms());
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("我是认证");
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
User userByName = service.getUserByName(token.getUsername());
if(userByName==null){
return null;
}
Object pricipal=userByName;
// 这里的pricipal会共享到授权方法,而且能够通过SecurityUtils来获取subject
return new SimpleAuthenticationInfo(pricipal,userByName.getPwd(),"");
}
}
代码(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");
// 可以访问add需要的权限
filterChainDefinitionMap.put("/add","perms[user:add]");
filterChainDefinitionMap.put("/update","perms[user:update]");
bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
bean.setLoginUrl("/toLogin");
bean.setUnauthorizedUrl("/anno");
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();
}
}