Shrio02 Realm作用、自定义简洁Realm、Realm实现类使用

 

1 Realm简介

1.1 Realm作用

shiro最终是通过Realm获取安全数据的(如用户、角色、权限),也就是说认证或者授权都会通过Realm进行数据操作

1.2 Realm接口

1.2.1 源代码

1.2.2 方法说明
》getName:返回一个唯一的 Realm 名字 
》supports:判断此 Realm 是否支持此 Token 
》getAuthenticationInfo:根据 Token 获取认证信息,该方法就是用来实现认证逻辑的(从Realm的实现类org.apache.shiro.realm.AuthenticatingRealm#getAuthenticationInfo中可以看出)

1.3 AuthenticationToken

》层级关系

》关系图

》开发时一般将用户名和密码封装成一个UsernamePasswordToken对象

1.4 注意

》supports需要对Token类型进行判断,判断实参类型是否满足条件;这里指定的是AuthenticationToken类型(任何Token类型都可以传入,因为AuthenticationToken是一个父接口),所以在实现类中只需要判断实参是否是指定的Token类型即可(实际开发时传入的实参一般都是UsernamePasswordToken类型,所以在supports方法中只需要判定实参是否是这个类型即可)。
》实现认证的逻辑就是写在org.apache.shiro.realm.Realm#getAuthenticationInfo这个方法中的(从Realm的实现类org.apache.shiro.realm.AuthenticatingRealm#getAuthenticationInfo中可以看出)

1.5 简易自定义Realm

1.5.1 思路
》实现Realm接口
》getName返回一个唯一的Realm名称即可
》supports中判定实参类型是否是UsernamePasswordToken类型
》getAuthenticationInfo中实现认证逻辑
1.5.2 代码实现

复制代码
package com.xunyji.demo03.shirotest.realm;  import org.apache.shiro.authc.*; import org.apache.shiro.realm.Realm;  /**  * @author AltEnter  * @create 2019-01-20 20:11  * @desc 自定义简易Realm  **/public class MySimpleRealm implements Realm {      public String getName() {         return "mySimpleRealm";     }      public boolean supports(AuthenticationToken token) {         if (token instanceof UsernamePasswordToken) {             return true;         }         return false;     }      public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {         String username = (String) token.getPrincipal();         String password = new String((char[])token.getCredentials());         System.out.println(String.format("用户名为:%s, 用户密码为:%s", username, password));         if (!"fury".equals(username)) {             System.out.println("用户名错误");             return null;         }         if (!"111111".equals(password)) {             System.out.println("密码错误");             return null;         }          return new SimpleAuthenticationInfo(username, password, getName());     } }
复制代码

1.5.3 单元测试类

复制代码
package com.xunyji.demo03.shirotest.realm;  import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.subject.Subject; import org.junit.Test;  import static org.junit.Assert.*;  public class MySimpleRealmTest {            @Test     public void test01() {         MySimpleRealm mySimpleRealm = new MySimpleRealm();         DefaultSecurityManager defaultSecurityManager = 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信