创建一个激活的用户类:

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授权实现的更多相关文章

  1. shiro授权及自定义realm授权(七)

    1.授权流程

  2. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...

  3. shiro之自定义realm

    Shiro认证过程 创建SecurityManager--->主体提交认证--->SecurityManager认证--->Authenticsto认证--->Realm验证 ...

  4. Shiro -- (三) 自定义Realm

    简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...

  5. shiro(二)自定义realm,模拟数据库查询验证

    自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...

  6. 6、Shiro之自定义realm

    1.创建一个包存放我们自定义的realm文件: 创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写: CustomRea ...

  7. 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法

    先来看问题    纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...

  8. (十)shiro之自定义Realm以及自定义Realm在web的应用demo

    数据库设计 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  9. Shiro入门学习之自定义Realm实现授权(五)

    一.自定义Realm授权 前提:认证通过,查看Realm接口的继承关系结构图如下,要想通过自定义的Realm实现授权,只需继承AuthorizingRealm并重写方法即可 二.实现过程 1.新建mo ...

  10. Shiro入门 - 通过自定义Realm连数数据库进行授权

    shiro-realm.ini [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Spring中的注 ...

随机推荐

  1. vue devtools工具安装 Vue实现数据绑定的原理

    通过chrome中的谷歌插件商店安装Vue Devtools工具,此工具帮助我们进行vue数据调试所用,一定要安装. https://chrome.google.com/webstore?utm_so ...

  2. INFINI Labs 产品更新 | Easysearch 优化字段压缩提升写入速度,Console 优化数据迁移和校验等功能

    INFINI Labs 产品又更新啦~.本次更新概要如下:Easysearch 增强 source_reuse 压缩功能,并大幅提升写入速度:Console 优化了数据迁移和校验功能,新增了通用的数据 ...

  3. winform遍历控件的Controls.OfType<>方法

    页面TextBox控件较多时,可以使用类似的名字,方便遍历时整体的修改,可以使用Controls.OfType<TextBox>()获取所有文本框: 需要引用命名空间System.Linq ...

  4. xxlJob Cron表达式 0 0 8,13 * * ?

    xxlJob Cron表达式  0 0 8,13 * * ? Cron有如下两种语法格式:(1)Seconds Minutes Hours DayofMonth Month DayofWeek Yea ...

  5. pycharm中运行jupyter notebook

    进入anaconda prompt,进入对应的虚拟环境 输入jupyter notebook,找到路径和token 这两个随便复制一个,注意是包括token也要复制到 然后打开pycharm,并建立一 ...

  6. 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 ...

  7. Nuxt3 的生命周期和钩子函数(四)

    title: Nuxt3 的生命周期和钩子函数(四) date: 2024/6/28 updated: 2024/6/28 author: cmdragon excerpt: 概述了Nuxt3的六个关 ...

  8. Spark3学习【基于Java】2. Spark-Sql核心概念

    SparkSession 从Spark2开始,Spark-SQL引入了SparkSession这个核心类,它是处理DataSet等结构数据的入口.在2.0之前,使用的是spark-core里的Spar ...

  9. ubuntu insight卸载

    最近需要进行gdb调试,但感觉gdb命令行方式不够直观,于是按照教程下载安装了insight,期间各种出错和bug,好不容易安装完成,却发现安装后的gdb版本变成了6.8-1,与gcc版本不兼容. 无 ...

  10. 洛谷P1365

    WJMZBMR打osu! / Easy 题目背景 原 维护队列 参见 P1903 题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有 ...