Shiro安全框架第六篇| 自定义的Realm

自定义的Realm

我这里在原来的项目java/com.jiuyue.shiro下新建一个realm包,再建一个ConstomRealm类,继承AuthorizingRealm类,并且实现它的两个抽象方法。

 1public class ConstomRealm extends AuthorizingRealm {
 2    @Override
 3    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
 4        //在次方法体中实现用户的角色以及权限的人证
 5        return null;
 6    }
 7
 8    @Override
 9    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
10        //在次方法体中实现用户信息(username,passwprd)的认证
11        return null;
12    }
13}

这里为了演示,直接在ConstomRealm类中,模拟数据库信息存储,没有连接mysql数据库,使用HashMap集合。

1    Map<String,String> userMap = new HashMap<>();
2    {
3        userMap.put("jiuyue","12345");
4        super.setName("costomReal");
5    }

设计一个查询信息的接口,根据用户名返回用户密码,模拟到数据库查询相关用户信息。

1    private String getPasswordByUserName(String userName) {
2        return userMap.get(userName);
3    }

接下来在认证方法中实现自定义Realm的认证的代码编写,从主体中获取认证信息用户名,通过用户名过去密码,查询到用户,则返回AuthenticationInfo对象。

 1    @Override
 2    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
 3        //1、从主体中获取认证信息的用户名
 4        String userName = (String) token.getPrincipal();
 5        //2、通过用户名获得密码
 6        String password =  getPasswordByUserName(userName);
 7        if (password==null){
 8            return null;
 9        }
10        //查询到用户,则返回AuthenticationInfo对象
11        SimpleAuthenticationInfo simpleAuthenticationInfo =
12        new SimpleAuthenticationInfo(userName,password,"customReal");
13        return simpleAuthenticationInfo;
14    }

测试代码

 1/**
 2 * Create bySeptember
 3 * 2018/10/27
 4 * 14:29
 5 */
 6public class CostomRealTest {
 7   @Test
 8    public void costomRealTest(){
 9       ConstomRealm constomRealm =new ConstomRealm();
10       //构建SecurityManager环境
11       DefaultSecurityManager defaultSecurityManager =new DefaultSecurityManager();
12
13       //将自定义的constomRealm设置到SecurityManager中
14       defaultSecurityManager.setRealm(constomRealm);
15
16       SecurityUtils.setSecurityManager(defaultSecurityManager);
17       Subject subject = SecurityUtils.getSubject();
18
19       UsernamePasswordToken token =new UsernamePasswordToken("jiuyue","12345");
20       subject.login(token);
21       System.out.println("isAuthenticated:"+subject.isAuthenticated());
22   }
23
24}

下面在doGetAuthorizationInfo(PrincipalCollection principals)实现用户角色权限验证

1    @Override
2    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
3        return null;
4    }

首先我们应该模拟数据库,设计查询用户角色,以及权限的接口,这里也是为了方便直接根据认证用户的信息获取用户的角色权限。在这里模拟的是提交的用户是否jiuyue,如果是则具有集合中的权限(相当于数据库中这个用户拥有的权限)。

 1    private Set<String> getPermissionByUserName(String userName) {
 2        Set<String> sets = new HashSet<>();
 3        if (userName.equals("jiuyue")) {
 4            sets.add("user:delete");
 5            sets.add("user:add");
 6        }
 7        return sets;
 8    }
 9
10    private Set<String> getRolesByUserName(String userName) {
11        Set<String> sets = new HashSet<>();
12        if (userName.equals("jiuyue")) {
13            sets.add("admin");
14            sets.add("user");
15        }
16        return sets;
17    }

权限验证,提交用户的信息与从数据库或者缓存中获取用户角色信息进行比较验证,如果该用户拥有对应权限,则,返回AuthorizationInfo对象。

 1    @Override
 2    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
 3
 4        String userName = (String) principals.getPrimaryPrincipal();
 5        //从数据库或者缓存中获取用户角色信息
 6        Set<String> roles = getRolesByUserName(userName);
 7        System.out.println("UserName:"+userName);
 8
 9        Set<String> permissions = getPermissionByUserName(userName);
10        SimpleAuthorizationInfo simpleAuthorizationInfo =
11                new SimpleAuthorizationInfo();
12        simpleAuthorizationInfo.setRoles(roles);
13
14        simpleAuthorizationInfo.setStringPermissions(permissions);
15        return simpleAuthorizationInfo;
16    }

测试代码:

 1public class CostomRealTest {
 2   @Test
 3    public void costomRealTest(){
 4       ConstomRealm constomRealm =new ConstomRealm();
 5       //构建SecurityManager环境
 6       DefaultSecurityManager defaultSecurityManager =new DefaultSecurityManager();
 7       defaultSecurityManager.setRealm(constomRealm);
 8
 9       SecurityUtils.setSecurityManager(defaultSecurityManager);
10
11       Subject subject = SecurityUtils.getSubject();
12
13       UsernamePasswordToken token =new UsernamePasswordToken("jiuyue","12345");
14       subject.login(token);
15
16       System.out.println("sAuthenticated:"+subject.isAuthenticated());
17
18       subject.checkRole("admin");
19
20       subject.checkRoles("user","admin");
21
22       subject.checkPermission("user:add");
23
24   }
25
26}

专题链接:

Shiro安全框架第一篇| 什么是Apache Shiro?

Shiro安全框架第二篇| Shiro的整体架构

Shiro安全框架第三篇| Shiro的认证,授权

Shiro安全框架第四篇| Shiro自定义Realm进行认证授权

Shiro安全框架第五篇| 使用JdbcRealm进行认证授权

                   “扫码关注“

猜你喜欢

转载自blog.csdn.net/qq_37745470/article/details/84849546
今日推荐