Shiro简单入门+个人理解(3)
最后一天,对shiro框架的应用也到此为至了,可能不是太全,但相对于一般的项目,它的作用已经使用了很多了
Shiro的授权:
授权:对用户资源访问的授权(是否允许用户访问此资源)
用户访问系统资源时的授权流程如下:

1)系统调用subject相关方法将用户信息(例如isPermitted)递交给SecurityManager
2)SecurityManager将权限检测操作委托给Authorizer对象
3)Authorizer将用户信息委托给realm.
4)Realm访问数据库获取用户权限信息并封装。
5) Authorizer对用户授权信息进行判定。
自定义realm(重点)
@Service
public class ShiroUserRealm extends AuthorizingRealm {//AuthenticatingRealm (提供了认证数据的获取方法)
//同样省略dao
//自定义缓存map(缓存用户权限信息)
private Map<String,SimpleAuthorizationInfo> authorMap=
new ConcurrentHashMap<String,SimpleAuthorizationInfo>();
/**此方法提供认证数据的获取操作*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token)
throws AuthenticationException {
System.out.println("==获取用户认证信息==");
//1.获取用户名(从令牌对象获取)
UsernamePasswordToken upToken=
(UsernamePasswordToken)token;
String username=upToken.getUsername();
// String username=(String)token.getPrincipal();
// System.out.println("username="+username);
//2.基于用户名执行查询操作获取用户对象
User user=sysUserDao.findUserByUserName(username);
//3.对用户对象进行判定
//3.1判定用户是否存在
if(user==null){
throw new UnknownAccountException();
}
//3.2密码验证
//4.对用户相关信息进行封装(密码)
SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(
user,//principal (用户新身份)
user.getUSER_PWD(),//hashedCredentials(已加密的凭证)
getName());//realmName real name
//5.返回封装好的数据(返回给认证管理器)
return info;//交给认证管理器
}
/**
*此方法提供授权数据的获取操作,当我们访问系统中的一个需要
*授权访问的方法时,shiro框架底层会通过如下方法获取用户权限
*信息.
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
//1.获取登录用户信息(用户身份对象)
User user=(User)principals.getPrimaryPrincipal();
if(authorMap.containsKey(user.getUSER_NAME()))
return authorMap.get(user.getUSER_NAME());
System.out.println("==获取用户权限信息===");
//2.获取用户具备的权限信息
//2.1 根据用户id获取用户拥有的角色
System.out.println(".......");
System.out.println(user.getUSER_I());
List<Integer> roleIds=
sysUserRoleDao.findRoleIdsByUserId(user.getUSER_I());
if(roleIds==null||roleIds.size()==0){
throw new AuthorizationException("您无权访问");
}
System.out.println("第一次测试");
//2.2.基于角色id获取角色对应的菜单id
List<Integer> menuIds=
sysRoleMenuDao.findMenuIdsByRoleId(
roleIds.toArray(new Integer[]{}));
if(menuIds==null||menuIds.size()==0){
throw new AuthorizationException("您无权访问");
}
System.out.println("第二次测试");
//2.3.基于菜单id获取菜单表中定义的权限标识(权限)`
List<String> permissions=
sysMenuDao.findPermissions(menuIds.toArray(new Integer[]{}));
System.out.println("第三次测试");
//3.封装用户权限信息
Set<String> permissionSet=new HashSet<String>();
for(String per:permissions){
if(!StringUtils.isEmpty(per)){
permissionSet.add(per);
}//去重,去空(null,"")
}
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
info.setStringPermissions(permissionSet);
//4.返回封装结果
authorMap.put(user.getUSER_NAME(), info);
return info;
}
}
在需要进行授权检测的方法上添加执行此方法需要的权限标识
例如
注解方式
@RequestPermissions(“interface:getInterfaceConfig”)
xml配置方式
<entry key="/company/deleteCompany.do" value="perms[company:delete]" /> -->
jsp方式
<shiro:hasPermission name="xtgl:userList">
<li class="top_menu" onclick="selectChannel(this)" id="menu_4"><a onfocus="this.blur();" hidefocus="true"><span><img src="data:images/icon/nav_icon2.png" /></span><p>用户管理</p></a></li>
</shiro:hasPermission>
标识都是存在数据库里(依靠查询判断)
在realm有抛出异常的可能所以为大家提供全局异常类
package com.cn.ericsson.controler;
import java.util.List;
import org.apache.shiro.ShiroException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.bind.annotation.ControllerAdvice;
/**
* @ControllerAdvice注解修饰的类为spring mvc中的全局异常处理类
*/
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.cn.ericsson.util.AppUtil;
import com.cn.ericsson.util.PageData;
import com.cn.ericsson.util.json.ClientJsonUtil;
/**
* @ControllerAdvice 注解修饰的类为全局异常处理类
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ShiroException.class)
@ResponseBody
public Object doShiroException(
ShiroException exp){
exp.printStackTrace();//控制台输出
//System.out.println("asdfasdfasdfasdfasdfasdfasdfasfasdfasdfasdfasdfasdfasdfasdf"+exp);
// JsonResult r=new JsonResult();
//r.setState(0);//exception
Object item=null;
String data = null;
List list=null;
/*
* String data = ClientJsonUtil.assembleJson("查询成功", ClientJsonUtil.STATUS_200,list);
item = AppUtil.returnJsonpObject(new PageData(), data.toLowerCase());
*
* */
if(exp instanceof UnknownAccountException){
// r.setMessage("用户名不存在");
data = ClientJsonUtil.assembleJson("用户不存在",ClientJsonUtil.STATUS_201,list);
item=AppUtil.returnJsonpObject(new PageData(), data.toLowerCase());
}else if(exp instanceof LockedAccountException){
// r.setMessage("用户已被禁用");
data = ClientJsonUtil.assembleJson("用户被禁用",ClientJsonUtil.STATUS_201,list);
item=AppUtil.returnJsonpObject(new PageData(), data.toLowerCase());
}else if(exp instanceof IncorrectCredentialsException){
// r.setMessage("密码不正确");
data = ClientJsonUtil.assembleJson("密码错误",ClientJsonUtil.STATUS_201);
item=AppUtil.returnJsonpObject(new PageData(), data);
}else if(exp instanceof AuthorizationException){
//r.setMessage("没有此权限");
data = ClientJsonUtil.assembleJson("没有此权限",ClientJsonUtil.STATUS_201,list);
item=AppUtil.returnJsonpObject(new PageData(), data.toLowerCase());
}else{
//r.setMessage(exp.getMessage());
data = ClientJsonUtil.assembleJson("未知错误",ClientJsonUtil.STATUS_201,list);
item=AppUtil.returnJsonpObject(new PageData(), data.toLowerCase());
}
return item;
}
/**
* @ExceptionHandler 注解描述的方法为一个异常处理
* 方法
* @param e
* @return 封装了异常信息的JsonResult对象
*/
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JsonResult doHandleRuntimeException(
RuntimeException e){
e.printStackTrace();
return new JsonResult(e);
}//jackson
}
因为公司的的原因使用了两种方式,但都属于此类,请理解编写
Shiro简单入门+个人理解(3)的更多相关文章
- 权限框架 - shiro 简单入门实例
前面的帖子简单的介绍了基本的权限控制,可以说任何一个后台管理系统都是需要权限的 今天开始咱们来讲讲Shiro 首先引入基本的jar包 <!-- shiro --> <dependen ...
- shiro简单入门介绍
shiro是apache的一个java安全框架 可以完成认证,授权,加密,会话管理,基于web继承,缓存等 功能简介: 从外部来看: shiro架构 Subject:主体,代表了当前“用户”,这个用 ...
- C#委托的最简单入门和理解
委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能.所以一定要 ...
- shiro的简单入门使用
这里只是测试登录认证,没有web模块,没有连接数据库,用户密码放在shiro.ini配置中,密码没有加密处理,简单入门. 基于maven 先看目录结构 测试结果 pom.xml <?xml ve ...
- Shiro简单配置
注:这里只介绍Spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 核心包shiro- ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- [转] shiro简单配置
shiro(1) 注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 ...
- delphi指针简单入门
delphi指针简单入门: 看一个指针用法的例子: 1 var 2 X, Y: Integer; // ...
- 运维自动化之SALTSTACK简单入门
运维自动化之SaltStack简单入门 饱食终日而无所事事,是颓也,废也.但看昨日,费九牛二虎之力除一BUG便流连于新番之中,不知东方之既黑,实乃颓颓然而荒废矣.故今日来缀一文以忏昨日之悔. Salt ...
- Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...
随机推荐
- Centos LNMP 安装日记
环境介绍 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) mysql8.0.12_b ...
- 墨天轮访谈 | 华为云温云博:从客户视角出发,GaussDB(for Redis)究竟“香”在哪里?
分享嘉宾:温云博 华为云数据库NoSQL团队研发工程师 整理:墨天轮社区 导读 GaussDB(for Redis)采用云原生分布式架构,完全兼容Redis协议,支持丰富数据类型. 提供数据实时持久化 ...
- ADO.NET 和 ORM的区别
ADO: 1 大量的Sql语句-业务不同,Sql语句不同 2 需要根据不同的场景编写不同Sql语句-灵活去编写Sql语句-提前优化Sql 语句-提供高性能的Sql语句 3 不适合快速开发 4 可编程性 ...
- js中判断数据类型的方法有哪些
判断数据类型可以使用 typeof 但是typeof 判断数组和函数时返回的都是Object 不能具体判断,这时使用 instanceof 可以判断对象是否是另一个函数创造的 : 用法: typeof ...
- Kubernetes的RBAC权限控制
role和roleBinding Role资源定义了哪些操作可以在哪些资源上执行.也可以直接控制访问的url的权限,下面的cluster也是这样. 查询所有service的demo: apiVersi ...
- 游戏推荐业务中基于 sentinel 的动态限流实践
作者:来自 vivo 互联网服务器团队- Gao Meng 本文介绍了一种基于 sentinel 进行二次开发的动态限流解决方案,包括什么是动态限流.为什么需要引入动态限流.以及动态限流的实现原理. ...
- 在 K8s 中快速部署使用 GitLab 并构建 DevOps 项目
作者:张海立,KubeSphere 社区 Ambassador.Talented Speaker,社区用户委员会上海站副站长 原文链接:https://kubesphere.com.cn/blogs/ ...
- 云原生爱好者周刊:炫酷的 Grafana 监控面板集合
开源项目推荐 grafana-dashboards-kubernetes 这个项目提供了一系列比较炫酷的用于监控 Kubernetes 的 Grafana 监控面板,灵感来源于 kubernetes- ...
- 如何使用 VuePress 搭建博客网站并 Vercel 部署
先来看一下网站截图: 快速上手 1.创建并进入一个新目录 mkdir vuepress-starter && cd vuepress-starter 2.使用你喜欢的包管理器进行初始化 ...
- vue 从后端拿到验证码并点击刷新
验证码登录的实现思路1.前端从后端拿到验证码图片2.输入验证码进行登录3.后端拿到验证码进行比对,正确登录成功. 前端请求验证码直接写在img标签中即可,不必单独发送axios请求 // templa ...