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进行认证授权

                   “扫码关注“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Shiro定义Realm代码示例: ``` import org.apache.shiro.authc.*; import org.apache.shiro.realm.*; public class MyRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 这里实现权限和角色信息的获取和设置,可以从数据库或其他数据源获取 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.addRole("admin"); authorizationInfo.addStringPermission("user:create"); return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 这里实现用户认证,可以从数据库或其他数据源获取用户信息进行验证 String username = (String) token.getPrincipal(); String password = new String((char[]) token.getCredentials()); if (!"admin".equals(username)) { throw new UnknownAccountException(); } if (!"password".equals(password)) { throw new IncorrectCredentialsException(); } return new SimpleAuthenticationInfo(username, password, getName()); } } ``` 该自定义Realm实现了Shiro的`AuthorizingRealm`接口,实现了权限和角色信息的获取和设置,以及用户认证的方法。其中,`doGetAuthorizationInfo`方法用于获取用户的角色和权限信息,并将其封装到`AuthorizationInfo`对象中返回;`doGetAuthenticationInfo`方法用于验证用户的身份和凭证信息,并将其封装到`AuthenticationInfo`对象中返回。在这个简单的示例中,认证信息被硬编码为了"admin"和"password",实际使用时应该从数据库或其他数据源中获取。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值