目录
1、创建SpringBoot应用,集成Shiro及相关组件,pom.xml
Apache Shiro是一个Java的安全(权限)框架。
Shiro可以非常容易卡发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。
Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。
Authentication :身份认证授权登录
AUthorization:权限效验,验证某个已认证的用户是否拥有某个权限
Session Management:会话的管理,管理用户登录后的会话
Cryptography:加密,使用密码学加密数据
Web Support:Web支持,能够比较请以地整合到Web环境中
Concurrency:并发,ApacheShiro支持具有并发功能的多线程应用程序,也就是说支持在多线程应用中并发验证。
Testing:测试的支持
Caching:缓存的管理,对用户的数据进行缓存
“Run As”:允许用户以其他用户的身份来登录
Remember Me:记住我这个是非常常见的功能,即一次登录后,下次再来的话就不用登录了。
从外部来看Shiro,即从应用程序角度来观察如何使用Shiro完成工作:
?
?Subject:应用代码直接交互的对象是 Subject,也就是说 Shiro 的对外API 核心就是 Subject。 Subject 代表了当前“用户” , 这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;与 Subject 的所有交互都会委托给 SecurityManager;Subject 其实是一个门面,SecurityManager 才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager 交互;且其管理着所有 Subject;可以看出它是 Shiro的核心,它负责与 Shiro 的其他组件进行交互,它相当于 SpringMVC 中DispatcherServlet 的角色
Realm:Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说SecurityManager 要验证用户身份,那么它需要从Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色/权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource?
??
?Subject:任何可以与应用交互的“用户”;
SecurityManager :相当于SpringMVC 中的 DispatcherServlet;是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进行认证、授权、会话及缓存的管理。
Authenticator:负责 Subject 认证,是一个扩展点,可以自定义实现;可以使用认证策略(Authentication Strategy),即什么情况下算用户认证通过了;
Authorizer:授权器、 即访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;
Realm:可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是JDBC 实现,也可以是内存实现等等;由用户提供;所以一般在应用中都需要实现自己的 Realm;
SessionManager:管理 Session 生命周期的组件;而 Shiro 并不仅仅可以用在 Web环境,也可以用在如普通的 JavaSE 环境
CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少改变,放到缓存中后可以提高访问的性能
Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密/解密。?
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.5.3</version>
</dependency>
</dependencies>
public class StudentRealm extends AuthorizingRealm {
@Autowired
private StudentService service;
/**
* 授权
*
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
* 认证
*
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;//客戶端传过来的用户名和密码会封装到token里
Students students = service.findByUsername (token.getUsername ());//根据用户名去数据库查询用户
if (students != null) {//如果结果等于null,就return null
return new SimpleAuthenticationInfo (students,students.getPassword (),getName ());
}//根据抛出的异常来判断登录成功还是失败 如果抛用户名不存在异常则就是用户名错误 如果抛的是密码异常则就是密码错误
return null;//如果返回null 则shiro会抛出一个UnknownAccountException异常 如果不为null则就证明用户名是OK的
}
}
@Configuration
public class ShiroConfig {
//注册一个工场
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager manager){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager (manager);
return factoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager(@Qualifier("studentsRealm") StudentRealm realm){//通过Qualifier注解指定一个名字 通过名字去找到下方的been
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm (realm);
return manager;
}
//把创建的Realm放到IOC里面
@Bean
public StudentRealm studentsRealm(){
return new StudentRealm ();
}
}
认证过滤器:
anon:无需认证。
authc:必须认证。
authcBasic:需要通过HTTPBasic 认证。
user:不一定通过认证,只要曾经被Shiro记录即可,比如:记住我。
授权过滤器
perms:必须拥有某个权限才能访问。
role:必须拥有某个角色才能访问。
port:请求的端口必须是指定值才可以。
restL请求必须基于RESTful,POST,PUT,GET,DELETE。
ssl:必须是安全的URL请求,协议HTTPS。
创建三个页面,main.html、manage.html、administator.html
访问权限如下:
必须登录才能访问main.html
当前用户必须拥有manage授权才能访问manage.html
当前用户必须拥有administator角色才能访问administator.html
设置模板引擎的路径
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ******
url: jdbc:mysql://localhost:3306/test
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl