springboot集成shiro权限管理简单实现

2022-11-13 14:11:21 简单 权限 集成

前言

为了解决项目当中的权限管理问题,我们一般会选择引入spring security或者shiro框架来帮助我们更好地更快地构建权限管理体系。

依赖

首先第一步,我们需要给当前项目引入对应的依赖包。与Spring Boot集成一般首选starter包。

<!-- shiro权限管理框架 -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-WEB-starter</artifactId>
    <version>1.9.1</version>
</dependency>

配置

无论是spring security还是shiro,两者都是基于servlet的Filter过滤器机制实现的权限管理。所以第一步配置我们就需要把对应的Filter给加入进来。

Filter过滤器配置

@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean() {
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    // 设置securityManager,负责权限验证的核心事务处理。
    shiroFilterFactoryBean.setSecurityManager(securityManager());
    // 配置过滤器链
    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    // anon表示该url不需要经过权限验证
    filterChainDefinitionMap.put("/static
public class PassWordHashedCredentialsMatcher extends HashedCredentialsMatcher {
​
    public PasswordHashedCredentialsMatcher(String hashAlGorithmName) {
        super(hashAlgorithmName);
        setHashIterations(2);
    }
​
    public String encryptedPassword(String passwordString, String salt) {
        return hashProvidedCredentials(passwordString, ByteSource.Util.bytes(salt), getHashIterations()).toHex();
  }
}

其实我们就是继承了HashedCredentialsMatcher,在它的基础上提高了直接针对密码加密的功能。这样既能满足shiro的登陆验证,又能拿出来用到创建用户的时候加密使用。

测试

为了验证我们的配置是否成功,我们需要写几个测试接口:

package com.example.awesomespring.controller;
​
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
​
  @GetMapping("/{id}")
  @RequiresPermissions("User:info")
  String getUserInfo(@PathVariable String id) {
    log.info("获取用户信息开始");
    log.info("请求参数 id:{}", id);
    log.info("获取用户信息结束");
    return "getUserInfo";
  }
​
  @GetMapping("/hello")
  String hello() {
    return "hello world!";
  }
​
  @GetMapping("/read")
  @RequiresPermissions("User:read")
  String read() {
    return "read";
  }
}

上面的几个接口,我们如果直接访问的话,在浏览器中,会被重定向到"/login"页面,因为我们目前没有这个页面,所以一旦重定向这个url,说明用户没有登陆。

其次我们通过调用post请求"/login",提交username和password成功登陆后,页面会重定向到"/index"页面,目前我们也是没有这个页面的,不过从响应体中可以看到响应码是302。

当我们在用户登陆成功后,再访问"/user/read"是能正常访问,并返回结果"read";如果访问"/user/123456"是不行的,页面会直接报500错误。

通过上述测试,我们已经初步完成了shiro的集成

到此这篇关于SpringBoot集成shiro权限管理简单实现的文章就介绍到这了,更多相关springboot 集成shiro内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章