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) 表示用户对其数 ...
随机推荐
- T2 的莫反式子
正在实现,不知道对不对,但是先放这,哪个大佬发现问题了和我说下 设 \[f(l)=\sum\cdots\sum[\gcd=1,\text{lcm}=l] \] \[g(l)=\sum\cdots\su ...
- Vue 3 + Vite + SuerMap iClient构建报错Uncaught TypeError utils.inherits is not a function
一.现象 Uncaught TypeError: utils.inherits is not a function 二.问题产生原因 Elasticsearch本身就需要这些东西,以前没有问题是因为W ...
- neo4j 统计多个节点之间关系总和的写法-包含多个collect合并成一个并去重操作
在使用neo4j数据库时,会遇到计算与指定节点产生关联的数量统计需求,例如指定6个节点1,2,3,4,5,6需要找出与这6个节点中4个节点有关联的节点(要求排除这6个节点的数据) 先看实现查询语句: ...
- 《Vue.js 设计与实现》读书笔记 - 第9章、简单 Diff 算法
第9章.简单 Diff 算法 9.1 减少 DOM 操作的性能开销 在之前的章节,如果新旧子节点的类型都是数组,我们会先卸载所有旧节点,再挂载所有新的子节点.但是如果存在相同类型的节点,我们完全可以复 ...
- 精彩回顾|【ACDU 中国行·杭州站】数据库主题交流活动成功举办!
8月19日下午,[ACDU 中国行·杭州站]在杭州西溪万怡酒店圆满落下帷幕.本次活动由中国数据库联盟(ACDU)联合墨天轮社区主办,蚂蚁集团 OceanBase 及亚信科技 AntDB 赞助支持.六位 ...
- .NET 内存管理两种有效的资源释放方式
前言 嗨,大家好!今天我们要聊一聊 .NET 中的内存管理.你知道吗?虽然 .NET 有一个很好的垃圾回收系统来自动清理不再使用的对象,但在某些情况下,我们还需要自己动手来释放一些特殊的资源,比如打开 ...
- 基于 KubeSphere 的运管系统落地实践
作者:任建伟,某知名互联网公司云原生工程师,容器技术信徒,云原生领域的实践者. 背景介绍 在接触容器化之前,我们团队内部的应用一直都是基于虚拟机运管,由开发人员自行维护. 由于面向多开发部门服务,而开 ...
- [图像处理] 基于CleanVision库清洗图像数据集
CleanVision是一个开源的Python库,旨在帮助用户自动检测图像数据集中可能影响机器学习项目的常见问题.该库被设计为计算机视觉项目的初步工具,以便在应用机器学习之前发现并解决数据集中的问题. ...
- 顺序表(C语言)
文章目录 1.定义顺序表结构体 2.初始化顺序表 3.插入元素 3.1顺序表头插 3.2 顺序表尾插 4.删除顺序表指定元素 5.查找元素 6.输出顺序表 7.销毁顺序表 在数据结构的世界里,顺序表是 ...
- linux环境安装pip
1.下载pip安装包 https://files.pythonhosted.org/packages/ce/ea/9b445176a65ae4ba22dce1d93e4b5fe182f953df71a ...