Shiro是什么?
Shiro是一款主流的Java安全框架,不依赖任何容器,可以运行在Java SE和Java EE项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。
Shiro的核心组件
权限管理可以分为三大板块:用户、角色、权限
权限赋予给角色,用户再拥有角色
通过这种方式来为用户赋予权限
UsernamePasswordToken
:Shiro用来封装用户登录信息,使用用户的登录信息来创建令牌Token。SecurityManager
:Shiro的核心部分,负责安全认证与授权。Subject
:Shiro的一个抽象概念,包含了用户信息,表示“当前正在操作的用户”。Realm
:开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在Realm中。Authenticationinfo
:用户的角色信息集合,认证时使用。Authorizationinfo
:角色的权限信息集合,授权时使用。DefaultWebSecurityManager
:安全管理器,开发者自定义的Realm需要注入到该组件进行管理才能生效。ShiroFilterFactoryBean
:Shiro过滤器工厂,Shiro的基本运行机制是开发者定制规则,Shiro去执行,具体的执行就是由该组件创建的Filter对象来执行。
搭建集成Shiro的Spring Boot框架
pom.xml中引入Shiro
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.9.1</version> </dependency>
自定义Shiro过滤器
在realm包中新建AccountRealm
public class AccountRealm extends AuthorizingRealm { @Autowired private AccountService accountService; /** * 授权 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } /** * 认证 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { // 前端传过来的用户名密码封装到↓这个token里 UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; // 通过查询数据库中的account来比对前端传过来的数据,如果没有则直接返回null Account account = accountService.findByUsername(token.getUsername()); // 如果不为null,则还需要验证密码 if(account != null){ // 直接返回一个↓这个对象,它会将account的密码跟token的密码进行比对,相同则通过,不同就抛异常 return new SimpleAuthenticationInfo(account, account.getPwd(), getName()); } // 如果返回null,shiro会自动抛出一个异常表示账户不存在 return null; } }
新建配置类
再config包中新建ShiroConfig配置类
@Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){ ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); factoryBean.setSecurityManager(defaultWebSecurityManager); return factoryBean; } @Bean public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("accountRealm") AccountRealm accountRealm){ DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(accountRealm); return manager; } @Bean public AccountRealm accountRealm(){ return new AccountRealm(); } }
编写认证和授权规则:
认证过滤器:
anon: 无需认证
authc: 必须认证
authcBasic: 需要通过HTTPBasic认证
user: 不一定通过认证,只要曾经被Shiro记录即可
授权过滤器:
perms: 必须拥有某个权限才能访问
role:必须拥有某个角色才能访问。
port:请求的端口必须是指定值才可以
rest:请求必须基于RESTful(POST、PUT、GET、DELETE)
ssl:必须是安全的URL请求,遵循HTTPS协议