1、shiro 功能简介
Authentication:身份认证/登录,验证用户是不是又相应的身份。
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,即判断用户是否能做事情,如:验证某个用户是否拥有某个角色或验证某个用户对某个资源是否拥有某个权限。
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,他的所有信息都存在会话中。
Cryptography:加密;保护数据的安全性,如密码加密存储到数据库中,而不是明文存储。
Web Support:Web支持,可以非常容易的集成到web环境中。
Caching:缓存,比如用户登录后,其用户信息拥有的角色/权限不必每次去查,这样可以提高效率。
Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。
Testing:提供测试支持。
Run As:允许一个用户假装另一个用户的身份进行访问。
Remember Me:记住我,这是一个常见的功能,即一次登录后,下次再来的话就不用登录了。
Subject:用户主体(把操作交给SecurityManager)。
SecurityManager:安全管理器(关联Realm)。
Realm:Shiro链接数据的桥梁。
2、Springboot与Shiro整合
2.1修改pom依赖
<!--shiro与spring的整合依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
2.2 自定义Realm类
public class UserRealm extends AuthorizingRealm {
/**
* 执行授权逻辑
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
return null;
}
/**
* 执行认证逻辑
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行认证逻辑");
return null;
}
}
2.2 编写shiro配置类
注:必须添加@Configuration注解
/**
* Shiro配置类
*/
@Configuration
public class ShiroConfig {
/**
* 创建ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
return shiroFilterFactoryBean;
}
/**
* 创建DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联Realm
securityManager.setRealm(userRealm);
return securityManager;
}
/**
*创建Realm
*/
@Bean(name = "userRealm")
public UserRealm getUserRealm(){
return new UserRealm();
}
}
2.3 通过shiro内置过滤器对一些页面进行拦截
@Configuration
public class ShiroConfig {
/**
* 创建ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
**//添加shiro内置的过滤器,可以实现权限拦截
/**
* 常用的拦截器
*anon:无需认证/登录
*authc:必须认证才可以访问
*user:如果使用Remember Me的功能可以直接访问
* perms:该资源必须得到资源权限才可以访问
* roles:该资源必须得到角色权限才可以访问
*/
Map<String,String> filterMap = new LinkedHashMap<String, String>();
//拦截 请求方法 拦截器
// filterMap.put("/add","authc");
//filterMap.put("/update","authc");
//通过通配符拦截所有请求除了登录
filterMap.put("/test","anon");
filterMap.put("/testLogin","anon");
filterMap.put("/logins","anon");
// filterMap.put("/add","anon");
//授权过滤器
//注:当授权拦截后,shiro会自动跳到未授权页面
filterMap.put("/add","perms[user:add]");
filterMap.put("/update","perms[user:update]");
filterMap.put("/*","authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
//修改跳转的登录页面
shiroFilterFactoryBean.setLoginUrl("/testLogin");//登录的请求方法,
//设置未授权提示页面
shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");**
return shiroFilterFactoryBean;
}
注意:filterMap添加的顺序
/**
* 创建DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联Realm
securityManager.setRealm(userRealm);
return securityManager;
}
/**
*创建Realm
*/
@Bean(name = "userRealm")
public UserRealm getUserRealm(){
return new UserRealm();
}
}
2.4 实现用户(登录)认证
2.4.1 编写Controller逻辑
@RestController
@Transactional
public class LoginController {
//跳转页面 若Controller上面用@RestController注解,那么跳转页 面就要借助ModelAndView
@RequestMapping(value = "/test",method = RequestMethod.GET)
public Object testThymeleaf() {
// 返回test.html
ModelAndView view = new ModelAndView("test");
return view;
}
//跳转页面
@RequestMapping(value = "/add",method = RequestMethod.GET)
public Object adds() {
ModelAndView view = new ModelAndView("add");
return view;
}
//跳转页面
@RequestMapping("/update")
public Object update() {
ModelAndView view = new ModelAndView("update");
return view;
}
//跳转页面
@GetMapping("/testLogin")
public Object testLogin(){
ModelAndView view = new ModelAndView("login");
return view;
}
/**
* 未授权页面
* @return
*/
@RequestMapping(value = "/noAuth",method = RequestMethod.GET)
public Object noAuth(){
ModelAndView view = new ModelAndView("noAuth");
return view;
}
/**
* 用户登录逻辑
*/
@RequestMapping(value = "/logins",method = RequestMethod.GET)
public Object login(String name,String pwd){
ModelAndView view;
//使用shiro编写认证操作
//1、获取Subject
Subject subject = SecurityUtils.getSubject();
//2、封装用户数据
UsernamePasswordToken token = new UsernamePasswordToken(name,pwd);
//3、执行登录方法
try {
subject.login(token);
//view = new ModelAndView("add");
return "成功";
}catch (UnknownAccountException e){
//登录失败,用户名不存在
return "用户名不存在";
}catch (IncorrectCredentialsException e){
//登录失败,密码不正确
return "密码不正确";
}
}
}
2.4.2 编写Realm的判断(认证)逻辑
UserRealm类中
/**
* 执行认证逻辑
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行认证逻辑");
//编写shiro判断逻辑,判断用户名和密码
//1、判断用户名
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
User user = userService.slectUser(token.getUsername());
if (user == null){
//用户名不存在
return null;//shiro底层会抛出UnknowAccountException
}
//2、判断密码 自己不需要做判断,shiro会通过SimpleAuthenticationInfo进行判断
//第一参数:需要返回服务器登录的数据 第二个参数:数据库密码 第三个参数:shiro名字
return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
3、整合mybatis实现登录
3.1 导入mybatis相关依赖
3.2 配置application.yml文件
4、springboot与shiro整合实现授权
使用shiro过滤器实现拦截
4.1 完成shiro资源授权
public class UserRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
/**
* 执行授权逻辑
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
//给资源进行授权
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//添加资源的授权字符串
info.addStringPermission("user:add");
return null;
}
}
springboot整合shiro
最新推荐文章于 2022-07-06 23:18:10 发布