一、Shiro概述
shiro核心组件
用户、角色、权限
给角色赋予权限,给用户赋予角色
- UsernamePasswordToken,Shiro用来封装用户登录信息,使用用户的登录信息来创建令牌Token。
- SecurityManager,Shiro 的核心部分,负责安全认证和授权。
- Subject,Shiro的一个抽象概念,包含了用户信息。
- Realm,开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在Realm中。
- AuthenticationInfo,用户的角色信息集合,认证时使用。
- AuthorzationInfo,角色的权限信息集合,授权时使用。
- DefaultWebSecurityDManager,安全管理器,开发者自定义的Realm需要注入到DefaultWebSecurityDManager进行管理才能生效。
- ShiroFilterFactoryBean,过滤器工厂,Shiro的基本运行机制是开发者定制规则,Shiro去执行,具体的执行操作就是由ShiroFilterEactoryBean创建的一个个Filter对象来完成。
编写认证和授权规则
认证过滤器
anon:无需认证。
authc:必须认证。
authcBasic:需要通过HITPBasic认证。
user:不一定通过认证,只要曾经被Shiro记录即可,比如:记住我。
自定义过滤器
授权过滤器
perms:必须拥有某个权限才能访问。
role:必须拥有某个角色才能访问。
port:请求的端口必须是指定值才可以。
rest:请求必须基于RESTful,POST、PUT、GET、DELETE。
ssl:必须是安全的URL 请求,协议HIIPS。
二、SpringBoot整合Shiro
1. 自定义Shiro过滤器
public class AccoutRealm extends AuthorizingRealm {
@Autowired
private AccountService accountService;
/**
* 认证
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
Account account = accountService.findByUsername(token.getUsername());
if(account != null){
return new SimpleAuthenticationInfo(account,account.getPassword(),getName());
}
return null;
}
}
/**
* 授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
2. 配置类(一般只动ShiroFilterFactoryBean,用于配置过滤规则)
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
//配置过滤规则
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/auth/perm/**", "authc");
filterMap.put("/auth/**", "anon");
filterMap.put("/**", "token");
factoryBean.setFilterChainDefinitionMap(filterMap);
return factoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager(@Qualifier("accoutRealm") AccoutRealm accoutRealm){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(accoutRealm);
return manager;
}
@Bean
public AccoutRealm accoutRealm(){
return new AccoutRealm();
}
}