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) 表示用户对其数 ...
随机推荐
- Flutter Engage China 开发者常见问题解答 | 下篇
再次感谢大家对 Flutter Engage China 活动 的关注和积极参与!我们在活动前后收到了很多来自开发者的反馈和问题,Flutter 团队和演讲嘉宾在直播 Q&A 环节中也针对部分 ...
- Windows平台下安装与配置MySQL9
要在Windows平台下安装MySQL,可以使用图行化的安装包.图形化的安装包提供了详细的安装向导,以便于用户一步一步地完成对MySQL的安装.本节将详细介绍使用图形化安装包安装MySQL的方法. 1 ...
- axios 常见状态码
'100': 'Continue', '101': 'SwitchingProtocols', '102': 'Processing', '103': 'EarlyHints', '200': 'Ok ...
- A星、Floyod、Bellman-Ford
A 星算法 A 星和 Dijkstra 算法唯一区别在于堆中排序的依据.distance 数组仍然保存实际代价,预估代价只影响堆的弹出顺序. Dijkstra 根据源点到当前点的实际代价进行排序. A ...
- Cartographer的扫描匹配
cartographer 代码思想解读(1)- 相关匹配 cartographer在2016年开源后一直在使用,但是一直未仔细阅读并分析其核心代码结构.目前网上可以找到许多博主对其分析和理解.其car ...
- Kafka社区KIP-500中文译文(去除ZooKeeper)
原文链接:https://cwiki.apache.org/confluence/display/KAFKA/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Mana ...
- 2.8 忘记root账户密码怎么办?
Linux 的单用户模式有些类似 Windows 的安全模式,只启动最少的程序用于系统修复.在单用户模式(运行级别为 1)中,Linux 引导进入根 shell,网络被禁用,只有少数进程运行. 单用户 ...
- games101_Homework3
在Raster部分实现数值插值,然后实现四种不同的像素着色器 作业描述: 作业1:修改函数 rasterize_triangle(const Triangle& t) in rasterize ...
- Python 抓取猫眼电影排行
import json import re import requests from requests.exceptions import RequestException import time # ...
- php 版本升级后需要对代码进行兼容性检测
来到需要检测代码的目录下 需要提前安装 docker 执行 docker run --rm -v $(pwd):/app vfac/php7compatibility 7.3 . --ignore=v ...