使用SpringBoot集成Shiro应用场景和示例代码

概述

Apache Shiro是一个强大且易于使用的Java安全框架,提供认证、授权、加密和会话管理等功能。通过与Spring Boot集成,可以方便地实现权限控制和安全管理。

应用场景

  1. 用户登录和认证:使用Shiro进行用户的身份验证,确保用户输入的凭据正确。
  2. 角色和权限管理:基于用户角色分配权限,限制用户能够执行的操作。
  3. 注解式权限控制:在方法级别使用注解控制访问权限,简化代码实现。
  4. 会话管理:管理用户的会话状态,如登录时间、过期处理等。
  5. 密码加密:对用户密码进行加密存储,保证安全性。

示例代码

1. 添加Shiro依赖

首先,在pom.xml文件中添加Spring Boot和Shiro的依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.8.0</version>
</dependency>
2. 配置Shiro

创建一个Shiro配置类,配置Shiro的安全管理器、Realm等:

@Configuration
public class ShiroConfig {

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 设置自定义Realm
        securityManager.setRealm(myRealm());
        return securityManager;
    }

    @Bean
    public Realm myRealm() {
        MyRealm realm = new MyRealm();
        // 设置密码校验规则等
        realm.setCredentialsMatcher(credentialsMatcher());
        return realm;
    }

    @Bean
    public CredentialsMatcher credentialsMatcher() {
        return new HashedCredentialsMatcher("SHA-256");
    }

    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        // 配置不需要拦截的路径
        chainDefinition.addPathDefinition("/login", "anon");
        // 配置需要认证的路径
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
    }
}
3. 自定义Realm

创建一个自定义的Realm,用于处理用户的认证和授权逻辑:

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    // 用户认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        User user = userService.findByUsername(username);
        if (user != null) {
            return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
        } else {
            throw new UnknownAccountException("用户不存在");
        }
    }

    // 用户授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        // 查询用户角色和权限,设置到AuthorizationInfo中
        User user = userService.findByUsername(username);
        authorizationInfo.addRoles(user.getRoles());
        authorizationInfo.addStringPermissions(user.getPermissions());
        return authorizationInfo;
    }
}
4. 控制器中使用Shiro

在Spring Boot的控制器中可以通过注解来实现权限控制:

@RestController
@RequestMapping("/api")
public class ExampleController {

    @RequiresPermissions("user:list")
    @GetMapping("/users")
    public ResponseEntity<List<User>> getUsers() {
        // 处理获取用户列表的业务逻辑
        List<User> userList = userService.getAllUsers();
        return ResponseEntity.ok(userList);
    }

    @RequiresRoles("admin")
    @PostMapping("/user")
    public ResponseEntity<String> createUser(@RequestBody User user) {
        // 处理创建用户的业务逻辑
        userService.createUser(user);
        return ResponseEntity.ok("User created successfully");
    }
}

总结

通过以上示例,可以看到如何使用Spring Boot集成Shiro来实现基本的权限控制。配置Shiro的安全管理器、Realm、过滤器链以及在控制器中使用注解来限制访问权限,能够帮助开发人员快速搭建安全可靠的应用程序。在实际开发中,可以根据具体的业务需求和安全要求进一步扩展和优化配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值