Shiro——自定义Realm中实现从数据库中动态获取用户信息、角色信息和权限信息

本文介绍在自定义Realm中实现从数据库中动态获取用户信息、角色信息和权限信息的详细步骤。

1. 创建数据库表

创建数据库表用于存储用户信息、角色信息和权限信息。

2. 自定义Realm

创建一个自定义的Realm,继承 AuthorizingRealm 类并实现从数据库中获取用户信息、角色信息和权限信息的逻辑。

import org.apache.shiro.authc.*;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

public class CustomRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        // 从数据库中获取用户角色信息和权限信息
        User user = userService.getUserByUsername(username);
        for (Role role : user.getRoles()) {
            authorizationInfo.addRole(role.getName());
            for (Permission permission : role.getPermissions()) {
                authorizationInfo.addStringPermission(permission.getName());
            }
        }
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());

        // 从数据库中查询用户信息
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UnknownAccountException("用户名不存在");
        }
        // 校验密码
        if (!password.equals(user.getPassword())) {
            throw new IncorrectCredentialsException("密码错误");
        }
        return new SimpleAuthenticationInfo(username, password, getName());
    }
}

3. UserService

创建一个UserService类,用于从数据库中获取用户信息。

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public User getUserByUsername(String username) {
        // 实现从数据库中查询用户信息的逻辑
    }
}

4. 配置Shiro

在Shiro配置类中注入自定义Realm和UserService。

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfig {

    @Bean
    public SecurityManager securityManager(Realm customRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(customRealm);
        return securityManager;
    }

    @Bean
    public Realm customRealm() {
        return new CustomRealm();
    }

    @Bean
    public UserService userService() {
        return new UserService();
    }
}

通过以上代码,实现了在自定义Realm中从数据库动态获取信息实现授权逻辑和认证逻辑的功能。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值