【Shiro】06 自定义Realm授权实现
创建一个激活的用户类:
public class ActiverUser {
private User user;
private List<String> roleList;
private List<String> permitList;
} // 省略SETTER & GETTER & CONSTRUCTOR ...
对应的创建业务层:
用户业务:
public interface UserService {
User queryUserByUserName(String username);
}
实现类:
这个Switch迷一样不支持String,不管了
public class UserServiceImpl implements UserService {
public User queryUserByUserName(String username) {
User user = null;
switch (username) {
case "zhangsan":
user=new User(1, "zhangsan", "123456", new Date());
break;
case "lisi":
user=new User(2, "lisi", "123456", new Date());
break;
case "wangwu":
user=new User(3, "wangwu", "123456", new Date());
break;
}
return user;
}
}
角色业务:
根据用户名查询对应的所有角色:
public interface RoleService {
List<String> queryRoleByUsername(String username);
}
实现类:
public class RoleServiceImpl implements RoleService {
public List<String> queryRoleByUsername(String username) {
return Arrays.asList("role1", "role2", "role3");
}
}
权限业务:
public interface PermissionService {
List<String> queryPermissionByUsername(String username);
}
实现类:
public class PermissionServiceImpl implements PermissionService{
public List<String> queryPermissionByUsername(String username) {
return Arrays.asList("user:query", "user:insert", "user:update", "user:delete");
}
}
UserRealm的修改:
package cn.echo42.shiro; import cn.echo42.pojo.User;
import cn.echo42.service.*;
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.Collection;
import java.util.List; /**
* @author DaiZhiZhou
* @file Shiro
* @create 2020-08-01 18:38
*/
public class UserRealm extends AuthorizingRealm { private UserService userService = new UserServiceImpl();
private RoleService roleService = new RoleServiceImpl();
private PermissionService permissionService = new PermissionServiceImpl(); protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
ActiverUser activerUser = (ActiverUser) principalCollection.getPrimaryPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //添加角色
Collection<String> roles = activerUser.getRoleList();
// 角色存在
if(null != roles && roles.size() > 0) {
info.addRoles(roles);
} Collection<String> permissions = activerUser.getPermitList();
//添加权限
if(null != permissions && permissions.size() > 0) {
info.addStringPermissions(permissions);
}
// if(activerUser.getUser().getType()==0) {
// info.addStringPermission("*:*");
// }
return info;
} protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { // 通过提交的令牌获取信息(用户名称?)
String principal = authenticationToken.getPrincipal().toString(); // 查询数据库得到记录
User user = userService.queryUserByUserName(principal); // user非空
if(null != user) {
// 装载用户到权限的所有信息
List<String> roles = roleService.queryRoleByUsername(user.getUsername());
List<String> permissions = permissionService.queryPermissionByUsername(user.getUsername());
ActiverUser activerUser = new ActiverUser(user, roles, permissions); // 返回认证信息出去
return new SimpleAuthenticationInfo(activerUser, authenticationToken.getCredentials(), this.getName());
}
return null;
}
}
【Shiro】06 自定义Realm授权实现的更多相关文章
- shiro授权及自定义realm授权(七)
1.授权流程
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
- shiro之自定义realm
Shiro认证过程 创建SecurityManager--->主体提交认证--->SecurityManager认证--->Authenticsto认证--->Realm验证 ...
- Shiro -- (三) 自定义Realm
简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...
- shiro(二)自定义realm,模拟数据库查询验证
自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...
- 6、Shiro之自定义realm
1.创建一个包存放我们自定义的realm文件: 创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写: CustomRea ...
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
先来看问题 纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...
- (十)shiro之自定义Realm以及自定义Realm在web的应用demo
数据库设计 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...
- Shiro入门学习之自定义Realm实现授权(五)
一.自定义Realm授权 前提:认证通过,查看Realm接口的继承关系结构图如下,要想通过自定义的Realm实现授权,只需继承AuthorizingRealm并重写方法即可 二.实现过程 1.新建mo ...
- Shiro入门 - 通过自定义Realm连数数据库进行授权
shiro-realm.ini [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Spring中的注 ...
随机推荐
- CSP-S2019 江西 题解
为什么有 \(5\) 道题? [CSP-S2019 江西] 和积和 简单化一下式子: \[(n + 1) \times \sum A_i \times B_i - (\sum A_i) \times ...
- [SWPUCTF 2021 新生赛]include
打开我们可以看到让我们传入一个file,会出现一串代码,我们去分析一下: 当看到ini_set("allow_url_include","on");设置为on, ...
- springboot3时代创建springboot2程序项目
springboot3时代创建springboot2程序项目 目前,IDEA,springboot 官网,都不能创建基于JDK8(JDK1.8)的springboot程序了. 解决办法: 1. 先在官 ...
- 像 Google SRE 一样 OnCall
在 Google SRE 的著作<Google运维解密>(原作名:Site Reliability Engineering: How Google Runs Production Syst ...
- Promise 期约
Promise 期约之前 回调地狱 设想这样一个经常发生的场景,我们希望处理Ajax请求的结果,所以我们将处理请求结果的方法作为回调传入,需要将请求结果继续处理,这就导致我们陷入了回调地狱 doSom ...
- Java中PDF的转换(图片)与展示
解决的问题 有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好. 那么怎 ...
- springboot增加@EnableAsync注解,否则方法中的@Async注解没有生效
springboot增加@EnableAsync注解,否则方法中的@Async注解没有生效. @EnableFeignClients(basePackages = {"com.test&qu ...
- idea编译报错 静态Map初始化报错java.lang.ExceptionInInitializerError
idea编译报错 静态Map初始化报错java.lang.ExceptionInInitializerError package cc.mrbird.utils; import java.util.H ...
- Debezium-Flink-Hudi:实时流式CDC
1. 什么是Debezium Debezium是一个开源的分布式平台,用于捕捉变化数据(change data capture)的场景.它可以捕捉数据库中的事件变化(例如表的增.删.改等),并将其转为 ...
- 煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答
煤矿安全大模型----矿途智护者 使用煤矿历史事故案例,事故处理报告.安全规程规章制度.技术文档.煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答. ...