1,前言
在以往的权限管理中,我们的权限管理通常是有以下几个步骤:
-
创建用户,分配权限。
-
用户登录,权限拦截器拦截请求,识别当前用户登录信息
-
从权限表中判断是否拥有权限
从以上步骤中可以提取到以下三个问题。
1.如何让Shiro拦截请求。
在web开发中,Shiro会提供一个拦截器来对请求进行拦截。
2.Shiro如何判断发起请求用户的身份?
在web开发中,会借助session来判断,如果禁用了session,那么可能需要重写一些方法。
3.如何判断权限?
Shiro使用realm来判断权限。
2, Shiro的介绍
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
Shiro不仅可以用于javaEE环境,也可以用于javaSE
3,Shiro功能
Authentication:身份认证,验证用户是否拥有某个身份。
Authorization: 权限校验,验证某个已认证的用户是否拥有某个权限。确定“谁”可以访问“什么”。
Session Management:会话管理,管理用户登录后的会话,
Cryptography:加密,使用密码学加密数据,如加密密码。
Web Support:Web支持,能够比较轻易地整合到Web环境中。
Caching:缓存,对用户的数据进行缓存,
Concurrency:并发,Apache Shiro支持具有并发功能的多线程应用程序,也就是说支持在多线程应用中并发验证。
Testing:测试,提供了测试的支持。
Run as :允许用户以其他用户的身份来登录。
Remember me :记住我
4.Shiro框架(外部)
- 可以看到:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject;其每个API的含义:
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者; - SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
- Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
也就是说对于我们而言,最简单的一个Shiro应用:
1、应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;
2、我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。
5.Shiro框架(内部)
6.Shiro脚本使用
项目目录:
6.1引用一个依赖
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-web -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
6.2 配置两个Bean
新建一个shiroConfig配置类,配置Shiro最为核心的安全管理器SecurityManager。该类中分别创建ShiroFilterFactoryBean、ShiroFilterFactoryBean、UserRealm。
@Configuration
public class shiroConfig {
//ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getDefaultWebSecurityManagerBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置完全管理器
bean.setSecurityManager(defaultWebSecurityManager);
return bean;
}
//ShiroFilterFactoryBean:2
@Bean(name="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager()