1.jdbcRealm已经实现了从数据库获取用户的验证信息,但是jdbcRealm灵活性太差。如果要实现自己的一些特殊应用将不能支持,这个时候可以通过自定义的Realm来达到目的。
2.Realm是一个接口,在接口中定义了更具token获取认证信息的方法。shiro内容实现了一系列的Realm。这些不同的Realm提供了不同的功能。AuthenticatingRealm实现了获取身份信息的功能,AuthorizingRealm实现了获取权限信息的功能。通常自定义Realm需要继承AuthorizingRealm,这样即提供了身份认证的自定义方法也可以实现授权的自定义方法。
3.实现自定义
开始写代码
shiro.ini配置文件(自定义Realm所以在配置文件中不用配置)
[main]
#自定义Realm
userRealm=com.box.tools.UserRealm
securityManager.realm=$userRealm
创建Java类
package com.box.tools;/**
* @title: UserRealm
* @projectName sixBox
* @description: TODO
* @author Lenovo
* @date 2019/12/242:39
*/
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
/**
*@ClassName {CLASSNAME}
*Description TODO
*Author {HanLiZe}
*Date 2019/12/24 2:39
*Version 1.0
**/
public class UserRealm extends AuthorizingRealm {
/**
* shiro
* 实现自定义Realm
* 该Realm类提供了两个方法,一个是doGetAuthorizationInfo、getName
*/
//授权的信息
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
//完成(从数据库中取出数据)身份认证并且返回认证信息
//如果身份认证失败返回null
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//获取用户输入的用户名
String username = (String)token.getPrincipal();//获取身份信息
System.out.println("username :" +username);
//更具用户名到数据库中查询密码信息---模拟
//假定从数据库获取的密码为123
String password = "123";
//从数据库中查询的信息封装到SimpleAuthenticationInfo中
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());
return info;
}
@Override
public String getName() {
return "urerRealm";
}
}
然后开始测试… …