一、Shior简介:
重点:java安全框架、认证、授权
百度百科介绍:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
主要功能:
三个核心组件:Subject, SecurityManager 和 Realms.
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
二、Spring boot 整合shior
1.雷打不动先添加jar包依赖,
<!-- shiro 依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.9.1</version>
</dependency>
<!-- thymeleaf 整合 shior-->
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>
2.自定义realm
当密码验证通过后,就到了我们的自定义realm,在我们自定义realm中实现了AuthorizingRealm接口,将其方法进行重写,将各种权限对用户进行授权,同时对用户身份进行验证,代码如下,每一行代码具体含义十分详细了。
public class UserRealm extends AuthorizingRealm {
@Resource
IUserService userService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("========授权方法正在执行==========");
//principalCollection 可以获取整体用户数据的
//SimpleAuthorizationInfo 权限初始化
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//拿到这个登录的对象
Subject subject = SecurityUtils.getSubject();
User currentUser= (User) subject.getPrincipal();//拿到User对象
int st=currentUser.getSt();
//设置当前用户的权限
info.addStringPermission(currentUser.getSt()+"");
if(st==1){
System.out.println("用户设置权限");
//info 添加了用户的add权限
info.addStringPermission("index:add");
info.addStringPermission("index:select");
}
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken userToken=(UsernamePasswordToken)token;
String password=new String((char[])token.getCredentials());
//从user中获取数据库用户信息
User user=userService.login(userToken.getUsername(),password);
System.out.println(user);
if (user!=null){
System.out.println("用户正确");
Subject currentSubject = SecurityUtils.getSubject();
//shiro的对象存入我们的用户
Session session = currentSubject.getSession();
session.setAttribute("loginUser",user);
String name=user.getName();
System.out.println(name);
return new SimpleAuthenticationInfo(user,user.getPassword(),"用户你好!");
} else {
return null;
}
}
}
3.实现shiroConfig配置类
配置了三个核心组件:Subject, SecurityManager 和 Realms.
@Configuration
//添加配置类注解
public class ShiroConfig {
//DefaultWebSecurityManager:2 配置securityManager安全管理器,主要起到一个桥梁作用。
@Bean(name = "securityManager1")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
//ShiroFilterFactoryBean:3 进行全局配置,Filter工厂。
// 设置对应的过滤条件和跳转条件,有自定义的过滤器,有shiro认证成功后,失败后,退出后等跳转的页面,
// 有静态页面等内容的权限范围。
@Bean(name = "shiroFilterFactoryBean")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager1") DefaultWebSecurityManager defaultWebSecurityManager){
System.out.println("正在执行。。getShiroFilterFactoryBean。。");
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
// 设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加Shiro内置过滤器
/*
* anon:无需认证就可以访问
* authc:必须认证了才能访问
* user:必须拥有 记住我 功能才能用
* perms:拥有对某个资源的权限才能访问
* role:拥有某个角色权限才能访问
* */
//登录拦截
Map<String, String> filterMap = new LinkedHashMap<>();
//授权
//filterMap.put("/user/add","perms[user:add]");
// 开放静态资源文件
filterMap.put("/css/**", "anon");
filterMap.put("/img/**", "anon");
filterMap.put("/js/**", "anon");
filterMap.put("/login.jsp", "anon");
filterMap.put("/student/showall", "perms[index:select]");
filterMap.put("/scoreshow", "perms[index:select]");
bean.setFilterChainDefinitionMap(filterMap);
//未授权页面
//bean.setUnauthorizedUrl("/noauth");
//设置登录的请求
bean.setLoginUrl("/login");
return bean;
}
//创建 realm 对象,需要自定义类:1
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
}