数据的调配就来自Realm,就是规则是来自配置文件还是数据库等其他方式
package com.dxp.realm;
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;
/**
* 自定义Realm实现 将认证/授权数据的来源转为数据库
*/
public class CustomerRealm extends AuthorizingRealm {
/**
* 本类中做授权的
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
* 父类中做认证的
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 1. 在token中获取用户名
String principal = (String) token.getPrincipal();
// 2. 根据身份信息使用jdbc mybatis查询相关数据库
if("xiaochen".equals(principal)){// 模拟“xiaochen”为数据库查询出来的用户名
/**
* 参数1: 返回数据库中正确的用户名
* 参数2:返回数据库中正确的密码
* 参数3:提供当前realm的名字
*/
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal, "123", this.getName());
return simpleAuthenticationInfo;
}
return null;
}
}
测试类
public static void main(String[] args) {
private static final Logger LOG = LoggerFactory.getLogger(Test.class);
// 1. 创建安全管理器securityManager
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
// 2. 设置自定义realm,指定规则来源
defaultSecurityManager.setRealm(new CustomerRealm());
// 3. 为安全工具类设置安全管理器
SecurityUtils.setSecurityManager(defaultSecurityManager);
// 4. 通过安全工具类获取主题Subject
Subject subject = SecurityUtils.getSubject();
// 5. 创建令牌(相当于用户输入的用户名和密码)
UsernamePasswordToken token = new UsernamePasswordToken("xiaochen", "123");
// 6. 登录
try {
subject.login(token);
LOG.info("认证是否通过:"+subject.isAuthenticated());
} catch (UnknownAccountException e) {
e.printStackTrace();
LOG.info("用户名错误");
} catch (IncorrectCredentialsException e) {
e.printStackTrace();
LOG.info("密码错误");
}
}