一、编写自定义realm
package com.chunan.shiro.realm;
import java.util.HashSet;
import java.util.Set;
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.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
/**
* 自定义realm
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2020/8/31 9:58 上午
*/
public class MyRealm extends AuthorizingRealm {
/**
* 获取授权信息.
*
* @param principals
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//1、从主体信息中 获取用户名
String userName = (String) principals.getPrimaryPrincipal();
// 2、通过用户名 在数据库中找到对应的角色
Set<String> roles = getRolesByUserName(userName);
// 3、通过用户名 在数据或者缓存中找到对应的 权限
Set<String> permissions = getPermissionsByUserName(userName);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 4、设置角色和权限
info.setRoles(roles);
info.setStringPermissions(permissions);
return info;
}
/**
* 根据用户名从数据库或者缓存中获取权限信息
* @param userName
* @return
*/
private Set<String> getPermissionsByUserName(String userName) {
Set<String> permissions = new HashSet<String>();
permissions.add("user:delete");
permissions.add("user:add");
return permissions;
}
/**
* 根据用户名从数据库中获取角色信息
* @param userName
* @return
*/
private Set<String> getRolesByUserName(String userName) {
//TODO 模拟数据库操作
Set<String> roles = new HashSet<String>();
roles.add("admin");
roles.add("user");
return roles;
}
/**
* 获取身份验证信息.
*
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
// 1、从主体信息中 获取用户名
String userName = (String) token.getPrincipal();
// 2、通过用用户名到数据库中 获取凭证
String passWord = getPassWordByUserName(userName);
// 3、判断凭证是否存在和正确
if (passWord == null) {
return null;
}
// 4、用户存在,创建返回对象
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo("ch",passWord,"MyRealm");
return info;
}
/**
* 获取密码
* @return
*/
private String getPassWordByUserName(String userName) {
// TODO 从数据库中查找密码
return "123";
}
}
二、编写测试类,测试 realm