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 =

