7.自定义Realm实现授权
1.仅仅通过ini配置文件来指定权限不够灵活,并且不方便。在实际应用中大多数情况下都将用户信息,角色信息,权限信息保存到数据库中,所以需要去数据库中获取相关的权限信息。可以使用shiro提供的jdbcRealm(当然也不灵活),也可以自定义Realm来实现。
2.自定义Realm需要继承AuthorizingRealm
【7.自定义Realm实现授权】ini配置文件:
[main]UserRealm=com.lyh.shouquanRealm_demo
securityManager.realms=$UserRealm
自定义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.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import java.util.ArrayList;
import java.util.List;
public class shouquanRealm_demo extends AuthorizingRealm {
//自定义授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
String username = principalCollection.getPrimaryPrincipal().toString();
System.out.println("授权的用户名------------"+username);
//根据这个用户名去数据库中查询出对应的权限信息
//模拟一下从数据库中查询出的结果
List permission = new ArrayList<>();
permission.add("user:add");
permission.add("user:update");
permission.add("user:delete");
permission.add("user:find");
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
for(String s:permission){
info.addStringPermission(s);
}
return info;
}//自定义身份认证方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取身份信息,获取用户输入的用户名
String username = (String)authenticationToken.getPrincipal();
System.out.println("用户名==========="+username);
//根据用户名到数据库查询密码
//模拟从数据库获得密码123
String pwd="123";
//将从数据库中查询的信息,封装到SimpleAuthenticationInfo中
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,pwd, getName());
return info;
}
}
shiro测试代码:
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class TestShouquanRealm_demo {
public static void main(String[] args) {
//1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
Factory factory= new IniSecurityManagerFactory("classpath:shouquanRealm.ini");
//2、得到SecurityManager实例 并绑定给SecurityUtils
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123");
try {
subject.login(token);
if(subject.isAuthenticated()){
System.out.println("验证通过");
}
boolean permitted = subject.isPermittedAll("user:add","user:find","user:update","user:delete");
System.out.println(permitted);
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("验证失败");
}
}
}
推荐阅读
- Python从零到壹|[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
- Vue|Vue高级篇--实现前后端完全分离
- 实现实时个性化推荐_每天30亿条笔记展示,小红书如何实现实时高效推荐()
- 数学建模算法与应用|插值方法(一维插值、三次样条插值、二维插值的matlab自带函数,python实现/作图)
- 数学建模算法与应用|整数规划,背包问题、指派问题、钢管切割问题的Matlab和python实现
- React可视化大屏编辑器的实现方案
- 容器化|容器化 | 在 S3 实现定时备份
- 30秒接入一台PLC设备,用Shifu 快速实现工控软件编程
- SSM框架解析|【SSM框架】Mybatis详解06(源码自取)之动态代理的实现
- C#实现访问OPC|C#实现访问OPC UA服务器