当前位置:   article > 正文

springboot项目中使用shiro框架基于RBAC实现权限控制_spring shiro权限控制

spring shiro权限控制
  1. 导入Shiro和Spring Boot相关的依赖项到项目的pom.xml文件中:
  2. 创建一个自定义的Realm类,继承AuthorizingRealm,并实现其中的方法。这个类负责用户身份认证和权限授权的逻辑。

  3. 创建一个Shiro配置类,使用@Configuration注解标记,并在该类中进行相关的配置,包括创建SecurityManager、配置Realm等。

  4. 创建一个登录页面和相应的登录Controller,用于处理用户登录请求。

  5. 在需要进行权限控制的Controller方法上,添加相应的Shiro注解(如@RequiresRoles@RequiresPermissions)来限制访问。

  • 1、在pom.xml文件中添加相关依赖项

    1. <!-- Shiro依赖 -->
    2. <dependency>
    3. <groupId>org.apache.shiro</groupId>
    4. <artifactId>shiro-spring-boot-starter</artifactId>
    5. <version>1.8.0</version>
    6. </dependency>
    7. <!-- Spring Boot Web依赖 -->
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-web</artifactId>
    11. </dependency>

    2、创建一个自定义的Realm类,继承AuthorizingRealm,并实现其中的方法。这个类负责用户身份认证和权限授权的逻辑。例如

    1. public class CustomRealm extends AuthorizingRealm {
    2. @Autowired
    3. private UserService userService;
    4. // 身份认证
    5. @Override
    6. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    7. String username = (String) token.getPrincipal();
    8. User user = userService.findByUsername(username);
    9. if (user == null) {
    10. throw new UnknownAccountException("用户名不存在");
    11. }
    12. SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
    13. user.getUsername(),
    14. user.getPassword(),
    15. ByteSource.Util.bytes(user.getSalt()),
    16. getName()
    17. );
    18. return authenticationInfo;
    19. }
    20. // 权限授权
    21. @Override
    22. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    23. SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    24. String username = (String) principals.getPrimaryPrincipal();
    25. User user = userService.findByUsername(username);
    26. for (Role role : user.getRoles()) {
    27. authorizationInfo.addRole(role.getName());
    28. for (Permission permission : role.getPermissions()) {
    29. authorizationInfo.addStringPermission(permission.getName());
    30. }
    31. }
    32. return authorizationInfo;
    33. }
    34. }

    3、创建一个Shiro配置类,使用@Configuration注解标记,并在该类中进行相关的配置,包括创建SecurityManager、配置Realm等。例如

    1. @Configuration
    2. public class ShiroConfig {
    3. @Bean
    4. public CustomRealm customRealm() {
    5. return new CustomRealm();
    6. }
    7. @Bean
    8. public SecurityManager securityManager(CustomRealm customRealm) {
    9. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    10. securityManager.setRealm(customRealm);
    11. return securityManager;
    12. }
    13. @Bean
    14. public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
    15. ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
    16. factoryBean.setSecurityManager(securityManager);
    17. // 配置URL的访问规则和权限要求
    18. Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    19. filterChainDefinitionMap.put("/admin/**", "roles[admin]");
    20. // 更多的URL配置
    21. factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
    22. return factoryBean;
    23. }
    24. }

    4、创建一个登录页面和相应的登录Controller,用于处理用户登录请求。例如

    1. @Controller
    2. public class LoginController {
    3. @GetMapping("/login")
    4. public String login() {
    5. return "login";
    6. }
    7. @PostMapping("/login")
    8. public String doLogin(String username, String password, boolean rememberMe) {
    9. Subject currentUser = SecurityUtils.getSubject();
    10. UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    11. token.setRememberMe(rememberMe);
    12. try {
    13. currentUser.login(token);
    14. return "redirect:/admin/dashboard"; // 登录成功后跳转到管理员页面
    15. } catch (AuthenticationException e) {
    16. // 处理登录失败的逻辑,如跳转到错误页面或显示错误信息
    17. return "login";
    18. }
    19. }
    20. }

    5、在需要进行权限控制的Controller方法上,添加相应的Shiro注解(如@RequiresRoles@RequiresPermissions)来限制访问。例如

    1. @Controller
    2. @RequestMapping("/admin")
    3. public class AdminController {
    4. @GetMapping("/dashboard")
    5. @RequiresRoles("admin")
    6. public String dashboard() {
    7. // 执行管理员首页的业务逻辑
    8. return "dashboard";
    9. }
    10. @GetMapping("/users")
    11. @RequiresPermissions("user:view")
    12. public String users() {
    13. // 执行查看用户列表的业务逻辑
    14. return "users";
    15. }
    16. // 其他需要权限控制的方法
    17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/437041
推荐阅读
相关标签
  

闽ICP备14008679号