【2020-03-02 SpringBoot 的Shiro 授权与认证的基本使用示例】

蔚落 2023-07-10 14:10 4阅读 0赞

SpringBoot 的Shiro 授权与认证的基本使用

项目结构在这里插入图片描述

1、引入pom文档

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.5.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.ybs</groupId>
  12. <artifactId>spring-shiro-web</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>spring-shiro-web</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.apache.shiro</groupId>
  30. <artifactId>shiro-spring</artifactId>
  31. <version>1.4.1</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.projectlombok</groupId>
  35. <artifactId>lombok</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-test</artifactId>
  40. <scope>test</scope>
  41. <exclusions>
  42. <exclusion>
  43. <groupId>org.junit.vintage</groupId>
  44. <artifactId>junit-vintage-engine</artifactId>
  45. </exclusion>
  46. </exclusions>
  47. </dependency>
  48. </dependencies>
  49. <build>
  50. <plugins>
  51. <plugin>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-maven-plugin</artifactId>
  54. </plugin>
  55. </plugins>
  56. </build>
  57. </project>

Realm

  1. package com.ybs.config;
  2. import com.ybs.pojo.User;
  3. import com.ybs.service.UserService;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.shiro.SecurityUtils;
  6. import org.apache.shiro.authc.*;
  7. import org.apache.shiro.authz.AuthorizationInfo;
  8. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  9. import org.apache.shiro.realm.AuthorizingRealm;
  10. import org.apache.shiro.subject.PrincipalCollection;
  11. import org.apache.shiro.subject.Subject;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. /** * UserRealm * * @author Paulson * @date 2020/3/2 22:40 */
  14. @Slf4j
  15. public class UserRealm extends AuthorizingRealm {
  16. @Autowired
  17. private UserService userService;
  18. // 授权
  19. @Override
  20. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  21. log.info("执行了 =》授权 doGetAuthorizationInfo");
  22. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
  23. // 拿到当前登录的对象
  24. Subject subject = SecurityUtils.getSubject();
  25. User currentUser = (User) subject.getPrincipal();
  26. // 设置当前的用户权限
  27. info.addStringPermission(currentUser.getPerms());
  28. return info;
  29. }
  30. // 认证
  31. @Override
  32. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  33. log.info("执行了 =》认证 doGetAuthorizationInfo");
  34. // 用户名、密码 数据库中取
  35. UsernamePasswordToken userToken = (UsernamePasswordToken) token;
  36. User user = userService.queryUserByName(userToken.getUsername());
  37. if (user == null){
  38. return null; // 抛出异常 UnknownAccountException
  39. }
  40. // 密码认证
  41. return new SimpleAuthenticationInfo(user, user.getPwd(),"");
  42. }
  43. }

Config

  1. package com.ybs.config;
  2. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  3. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  4. import org.springframework.beans.factory.annotation.Qualifier;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import java.util.HashMap;
  8. import java.util.LinkedHashMap;
  9. import java.util.Map;
  10. /** * ShiroConfig * * @author Paulson * @date 2020/3/2 22:38 */
  11. @Configuration
  12. public class ShiroConfig {
  13. // 3、ShiroFilterFactoryBean
  14. @Bean
  15. public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
  16. ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
  17. // 设置安全管理器
  18. bean.setSecurityManager(defaultWebSecurityManager);
  19. // 添加 shiro 的内置过滤器
  20. /* anno: 无需认证就可以访问 anthc: 必须认证才能访问 user: 必须拥有 记住我 功能才能用 perms: 拥有对某个资源的权限才能访问 role: 拥有某个角色权限才能访问 */
  21. // 拦截
  22. Map<String, String> filterMap = new LinkedHashMap<>();
  23. // 授权,正常情况下,没有授权会跳转到未授权页面
  24. filterMap.put("/user/add", "perms[user:add]");
  25. filterMap.put("/user/update", "perms[user:update]");
  26. // filterMap.put("/user/add", "authc");
  27. // filterMap.put("/user/update", "authc");
  28. filterMap.put("/user/*", "authc");
  29. bean.setFilterChainDefinitionMap( filterMap);
  30. // 设置登录请求
  31. bean.setLoginUrl("/toLogin");
  32. // 设置未授权页面
  33. bean.setUnauthorizedUrl("/noauth");
  34. return bean;
  35. }
  36. // 2、DefaultWebSecurityManager
  37. @Bean
  38. public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
  39. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  40. // 关联 UserRealm
  41. securityManager.setRealm(userRealm);
  42. return securityManager;
  43. }
  44. // 1、创建 Realm 对象,需要自定义
  45. @Bean
  46. public UserRealm userRealm(){
  47. return new UserRealm();
  48. }
  49. }

发表评论

表情:
评论列表 (有 0 条评论,4人围观)

还没有评论,来说两句吧...

相关阅读