shiro之 自定义Realm实现授权

1. 仅仅通过配置文件来指定权限不够灵活,并且不方便。在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息保存到了数据库中。所以需要从数据库中去获取相关的数据信息。可以使用shiro提供的JdbcRealm来实现,也可以自定义realm来实现。使用jdbcRealm往往也不够灵活。所以在实际应用大多数情况下都是自定义realm来实现。

2. 自定义Realm需要继承AuthorizingRealm代码如下:

/**
 * 自定义realm的实现  该realm类提供了两个方法 
 * doGetAuthenticationInfo 获取认证信息
 * doGetAuthorizationInfo 获取权限信息
 */
public class UserRealm extends AuthorizingRealm{
    @Override
    public String getName() {
        return "userRealm";
    }
    
    //完成身份认证(从数据库中取数据)并且返回认证信息
    //如果身份认证失败 返回null
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {
        //获取用户输入的用户名
        String username = (String)token.getPrincipal();//获取身份信息
        System.out.println("username====="+username);
        //根据用户名到数据库查询密码信息---模拟
        //假定从数据库获取的密码为1111
        String pwd = "1111";
        //将从数据库中查询的信息封装到SimpleAuthenticationInfo中
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,pwd,getName());
        return info;
    }
    //授权的信息
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
        String username = principal.getPrimaryPrincipal().toString();
        System.out.println("授权----------");
        System.out.println("username============"+username);
        //根据用户名到数据库查询该用户对应的权限信息----模拟
        List<String> permission = new ArrayList<String>();
        permission.add("user:add");
        permission.add("user:delete");
        permission.add("user:update");
        permission.add("user:find");
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        for(String perms:permission){
            info.addStringPermission(perms);
        }
        return info;
    }
}

配置文件:

[main]
userRealm=cn.sxt.realm.UserRealm
securityManager.realm=$userRealm
#在realm中给定了用户信息 该用户信息可以不用配置
[users]
zhangsan=1111

测试代码:

public static void main(String[] args) {
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager=factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "1111");
        try {
            subject.login(token);
            if(subject.isAuthenticated()){
                System.out.println("验证通过");
            }
        } catch (AuthenticationException e) {
            e.printStackTrace();
            System.out.println("验证失败");
        }
        System.out.println(subject.isPermittedAll("user:add","user:delete"));
        
    }
原文地址:https://www.cnblogs.com/forever2h/p/6856386.html