【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中的注 ...
随机推荐
- vue devtools工具安装 Vue实现数据绑定的原理
通过chrome中的谷歌插件商店安装Vue Devtools工具,此工具帮助我们进行vue数据调试所用,一定要安装. https://chrome.google.com/webstore?utm_so ...
- INFINI Labs 产品更新 | Easysearch 优化字段压缩提升写入速度,Console 优化数据迁移和校验等功能
INFINI Labs 产品又更新啦~.本次更新概要如下:Easysearch 增强 source_reuse 压缩功能,并大幅提升写入速度:Console 优化了数据迁移和校验功能,新增了通用的数据 ...
- winform遍历控件的Controls.OfType<>方法
页面TextBox控件较多时,可以使用类似的名字,方便遍历时整体的修改,可以使用Controls.OfType<TextBox>()获取所有文本框: 需要引用命名空间System.Linq ...
- xxlJob Cron表达式 0 0 8,13 * * ?
xxlJob Cron表达式 0 0 8,13 * * ? Cron有如下两种语法格式:(1)Seconds Minutes Hours DayofMonth Month DayofWeek Yea ...
- pycharm中运行jupyter notebook
进入anaconda prompt,进入对应的虚拟环境 输入jupyter notebook,找到路径和token 这两个随便复制一个,注意是包括token也要复制到 然后打开pycharm,并建立一 ...
- EMQX配置ssl/tls双向认证+SpringBoot项目整合MQTT_真实业务实践
一.使用docker搭建Emqx 1.拉取emqx镜像 docker pull emqx/emqx:5.7 2.运行 docker run -d --name emqx emqx/emqx:5.7 3 ...
- Nuxt3 的生命周期和钩子函数(四)
title: Nuxt3 的生命周期和钩子函数(四) date: 2024/6/28 updated: 2024/6/28 author: cmdragon excerpt: 概述了Nuxt3的六个关 ...
- Spark3学习【基于Java】2. Spark-Sql核心概念
SparkSession 从Spark2开始,Spark-SQL引入了SparkSession这个核心类,它是处理DataSet等结构数据的入口.在2.0之前,使用的是spark-core里的Spar ...
- ubuntu insight卸载
最近需要进行gdb调试,但感觉gdb命令行方式不够直观,于是按照教程下载安装了insight,期间各种出错和bug,好不容易安装完成,却发现安装后的gdb版本变成了6.8-1,与gcc版本不兼容. 无 ...
- 洛谷P1365
WJMZBMR打osu! / Easy 题目背景 原 维护队列 参见 P1903 题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有 ...