最后一天,对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)的更多相关文章

  1. 权限框架 - shiro 简单入门实例

    前面的帖子简单的介绍了基本的权限控制,可以说任何一个后台管理系统都是需要权限的 今天开始咱们来讲讲Shiro 首先引入基本的jar包 <!-- shiro --> <dependen ...

  2. shiro简单入门介绍

    shiro是apache的一个java安全框架 可以完成认证,授权,加密,会话管理,基于web继承,缓存等 功能简介: 从外部来看: shiro架构  Subject:主体,代表了当前“用户”,这个用 ...

  3. C#委托的最简单入门和理解

      委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能.所以一定要 ...

  4. shiro的简单入门使用

    这里只是测试登录认证,没有web模块,没有连接数据库,用户密码放在shiro.ini配置中,密码没有加密处理,简单入门. 基于maven 先看目录结构 测试结果 pom.xml <?xml ve ...

  5. Shiro简单配置

    注:这里只介绍Spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 核心包shiro- ...

  6. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  7. [转] shiro简单配置

    shiro(1) 注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 ...

  8. delphi指针简单入门

    delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   ...

  9. 运维自动化之SALTSTACK简单入门

    运维自动化之SaltStack简单入门 饱食终日而无所事事,是颓也,废也.但看昨日,费九牛二虎之力除一BUG便流连于新番之中,不知东方之既黑,实乃颓颓然而荒废矣.故今日来缀一文以忏昨日之悔. Salt ...

  10. Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门

    一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...

随机推荐

  1. BOOST <boost/asio.hpp> 奇怪的编译错误 boost/asio/detail/consuming_buffers.hpp:105:65: error

    在我的项目工程代码内#include <boost/asio.hpp>后导致了编译报错: ./include/boost/asio/detail/consuming_buffers.hpp ...

  2. 10-04 NOIP模拟赛

    10-04 NOIP模拟赛 喜提80+30+10=120分 T1 水管(flow) 题目描述 某国有 \(n\) 个城市,水利调配非常有问题,这导致部分地区出现严重的缺水,而部分地区却全年洪灾泛滥.政 ...

  3. Springboot自定义Prometheus采集指标

    添加依赖 <!--增加Prometheus依赖--> <dependency> <groupId>org.springframework.boot</grou ...

  4. SpringBoot.3中的aot.factories到底有什么用?和以前的spring.factories一样吗?

    首先,我们来澄清一下 aot.factories 和 spring.factories 之间的区别.这两个文件不仅名称不同,而且在功能上也存在显著差异.接下来,我们将深入探讨这两个文件的具体作用以及它 ...

  5. 一个SMMU内存访问异常的问题

    最近碰到棘手的问题: 以太网进行iperf测试时, 发生了SMMU (System Memory Management Unit)访问异常导致内核崩溃. 原本只是内部测试发现, 后面在试验车上也概率性 ...

  6. C# Webapi Filter 过滤器 - 生命周期钩子函数 - Exception Filter 基础

    什么是Filter ? 1. 切面编程机制,在 ASP.NET Core 特定的位置执行我们自定义的代码: 2. ASP.NET Core 中的Filter五种类型,Authorization ,fi ...

  7. 谈一谈 vuex 的运行机制

    Vuex提供数据(state)来驱动视图(vue components),通过dispath派发actions,在其中可以做一些异步的操作,然后通过commit来提交mutations,最后mutat ...

  8. 强化学习笔记之【SAC算法】

    强化学习笔记之[SAC算法] 前言: 本文为强化学习笔记第四篇,第一篇讲的是Q-learning和DQN,第二篇DDPG,第三篇TD3 TD3比DDPG少了一个target_actor网络,其它地方有 ...

  9. day05-JDK的卸载与安装

    JDK卸载 右键我的电脑--属性--高级系统设置--环境变量,找到JAVA_HOME安装目录,删除Java安装目录 删除JAVA_HOME 删除path下关于java的目录 cmd查看Java -ve ...

  10. WiFi基础(六):天线基础知识

    liwen01 2024.10.01 前言 麦克斯韦预言了电磁波的存在,赫兹通过实验证实了麦克斯韦的预言,马可尼基于无线电磁波的原理发明了无线电报系统,从此人类进入无线通信系统时代. 天线是通信系统中 ...