当前位置: 首页 > 编程日记 > 正文

智销功能_Shiro权限框架

Shiro是什么?

Spring security 重量级安全框架

Apache shiro 轻量级安全框架

Shiro是一个强大且易用的Java权限框架

四大基石

身份验证,授权,密码学,会话管理

/*** String algorithmName, Object source, Object salt, int hashIterations)* 第一个参数algorithmName:加密算法名称* 第二个参数source:加密原密码 * 第三个参数salt:盐值 * 第四个参数hashIterations:加密次数 */ SimpleHash hash = new SimpleHash("MD5","123456","itsource",10); System.out.println(hash.toHex()); 

4.自定义Realm

继承AuthorizingRealm

实现两个方法:doGetAuthorizationInfo(授权) /doGetAuthenticationInfo(登录认证)

//身份认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //1.拿用户名与密码 UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken; String username = token.getUsername(); //2.根据用户名拿对应的密码 String password = getByName(username); if(password==null){ return null; //返回空代表用户名有问题 } //返回认证信息 //准备盐值 ByteSource salt = ByteSource.Util.bytes("itsource"); //密码是shiro自己进行判断 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,password,salt,getName()); return authenticationInfo; } 
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { //拿到用户名 Principal:主体(用户对象/用户名) String username = (String)principalCollection.getPrimaryPrincipal(); //拿到角色 Set<String> roles = findRolesBy(username); //拿到权限 Set<String> permis = findPermsBy(username); //把角色权限交给用户 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.setRoles(roles); authorizationInfo.setStringPermissions(permis); return authorizationInfo; } 

注意:如果我们的密码加密,应该怎么判断(匹配器)

//一.创建我们自己的Realm
MyRealm myRealm = new MyRealm(); //创建一个凭证匹配器(无法设置盐值) HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(); // 使用MD5的方式比较密码 matcher.setHashAlgorithmName("md5"); // 设置编码的迭代次数 matcher.setHashIterations(10); //设置凭证匹配器(加密方式匹配) myRealm.setCredentialsMatcher(matcher); 

5.集成Spring

去找:shiro-root-1.4.0-RC2\samples\spring

5.1 导包

<!-- shiro的支持包 --><dependency><groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.4.0</version> <type>pom</type> </dependency> <!-- shiro与Spring的集成包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> 

5.2 web.xml

这个过滤器是一个代码(只关注它的名称)

  <filter><filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 

5.3 application-shiro.xml

在咱们的application引入

<import resource="classpath:applicationContext-shiro.xml" />

是从案例中拷备过来,进行了相应的修改

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 创建securityManager这个核心对象 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- 设置一个realm进去 --> <property name="realm" ref="jpaRealm"/> </bean> <!-- 被引用的realm(一定会写一个自定义realm) --> <bean id="jpaRealm" class="cn.itsource.aisell.shiro.JpaRealm"> <!-- 为这个realm设置相应的匹配器 --> <property name="credentialsMatcher"> <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <!-- 设置加密方式 --> <property name="hashAlgorithmName" value="md5"/> <!-- 设置加密次数 --> <property name="hashIterations" value="10" /> </bean> </property> </bean> <!-- 可以让咱们的权限判断支持【注解】方法 --> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> <!-- 真正实现权限的过滤器 它的id名称和web.xml中的过滤器名称一样 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!-- 登录路径:如果没有登录,就会跳到这里来 --> <property name="loginUrl" value="/s/login.jsp"/> <!-- 登录成功后的跳转路径 --> <property name="successUrl" value="/s/main.jsp"/> <!-- 没有权限跳转的路径 --> <property name="unauthorizedUrl" value="/s/unauthorized.jsp"/> <!-- anon:这个路径不需要登录也可以访问 authc:需要登录才可以访问 perms[depts:index]:做权限拦截 咱们以后哪些访问有权限拦截,需要从数据库中读取 --> <!-- <property name="filterChainDefinitions"> <value> /s/login.jsp = anon /login = anon /s/permission.jsp = perms[user:index] /depts/index = perms[depts:index] /** = authc </value> </property> --> <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap" /> </bean> <!-- 实例工厂设置 --> <bean id="filterChainDefinitionMap" factory-bean="filterChainDefinitionMapFactory" factory-method="createFilterChainDefinitionMap" /> <!-- 创建可以拿到权限map的bean --> <bean id="filterChainDefinitionMapFactory" class="cn.itsource.aisell.shiro.FilterChainDefinitionMapFactory" /> </beans> 

5.4 获取Map过滤

注意,返回的Map必需是有序的(LinkedHashMap)

public class FilterChainDefinitionMapFactory {/*** 后面这个值会从数据库中来拿* /s/login.jsp = anon* /login = anon* /s/permission.jsp = perms[user:index]* /depts/index = perms[depts:index]* /** = authc*/public Map<String,String> createFilterChainDefinitionMap(){ //注:LinkedHashMap是有序的 Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/s/login.jsp", "anon"); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/s/permission.jsp", "perms[user:index]"); filterChainDefinitionMap.put("/depts/index", "perms[depts:index]"); filterChainDefinitionMap.put("/**", "authc"); return filterChainDefinitionMap; } }

转载于:https://www.cnblogs.com/yh9264426/p/10623005.html

相关文章:

ARM、FPGA和DSP的特点和区别是什么?(转)

发布时间&#xff1a;2009-5-8 14:25 发布者&#xff1a;ARM 关键词&#xff1a;DSP, ARM, FPGA, 特点 DSP&#xff08;digital singnal processor&#xff09;是一种独特的微处理器&#xff0c;有自己的完整指令系统&#xff0c;是以数字信号来处理大量信息的器件。一个…

unix to linux,UNIX to Linux 的关键问题都有哪些?

答&#xff1a;针对问题描述有一些不同的观点。1、第一个问题就是应用架构的改造问题&#xff0c;需要支持负载均衡模式。说明&#xff1a;这个不一定需要支持负载均衡模式&#xff0c;首先本身LINUXONE提供多分区架构&#xff0c;不需要改变原有应用系统的部署模式。而且负载均…

MongoDb 查询时常用方法

Query.All("name", "a", "b");//通过多个元素来匹配数组Query.And(Query.EQ("name", "a"), Query.EQ("title", "t"));//同时满足多个条件Query.EQ("name", "a");//等于Query.Exist…

解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/

https://blog.csdn.net/quanqxj/article/details/79479943转载于:https://www.cnblogs.com/liuys635/p/10624068.html

从 StarCraft 2 Installer.exe 中提取种子文件

蛋疼的想在 Linux 下下载星际争霸&#xff0c;但是暴雪提供的是 exe 格式的文件&#xff0c;这其实就是个 BT 客户端&#xff0c;但是问题是怎么提取出里面的种子文件呢&#xff0c;经过一番 google 找到了答案。 直接用 Vi 或 Emacs 打开 exe 格式的文件&#xff0c;搜索“d8:…

linux下接口持续集成,部署jenkins持续集成工具

1、Linux安装配置jdk环境1.1、上传到 Linux 服务器&#xff1b;例如&#xff1a;上传至&#xff1a; cd /usr/local1.2、解压&#xff1a;rpm -ivh jdk-8u111-linux-x64.rpm1.3、环境变量配置cd /etc在etc下&#xff0c;找到 profile文件&#xff0c;增加如下如下配置&#xff…

iOS UILabel UITextView自适应文本,或文本大小自适应

//UILabel自适应文本的高度UILabel *label [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 300, 100)];label.numberOfLines 0;label.lineBreakMode NSLineBreakByWordWrapping;label.text "是它吗&#xff1f;哈哈&#xff0c;太兴奋了。”12日&#xff0c;随着土…

(原)War3 脚本分析5-基础脚本资源

众所周知War3编辑器非常强大&#xff0c;这种强大不仅是因为其拥有诸如地形编辑器、开关编辑器、声音编辑器、物体编辑器、战役编辑器、AI编辑器、物体管理器、输入管理器等非常全面且易于使用的功能&#xff0c;更为重要的是在其基础上MOD爱好者通过很简单的操作即可实现各式各…

Mysql统计分组区间的人数和

统计各分数区间数据 现在要统计&#xff1a;<50、50-60、60-70、70-80、80-90、90-100、>100分数区间的人数&#xff1b;利用 INTERVAL 划出7个区间&#xff1b;再利用 elt 函数将7个区间分别返回一个列名&#xff0c;如下SQL&#xff1a; 123456789101112131415 mysql&g…

tcl c语言笔试题,TCL技术类笔试题目.doc

TCL技术类笔试题目模拟电路试题一&#xff0e;二极管1.如图所示电路中&#xff0c;已知电源电压 E4V 时,I1mA。那么当电源电压 E8V 时 , 电流I的大小将是______2.稳压管通常工作于______&#xff0c;来稳定直流输出电压截止区 正向导通区 反向击穿区3. 由二极管的伏安特性可知&…

Js-函数式编程

前言 JavaScript是一门多范式语言&#xff0c;即可使用OOP&#xff08;面向对象&#xff09;&#xff0c;也可以使用FP&#xff08;函数式&#xff09;&#xff0c;由于笔者最近在学习React相关的技术栈&#xff0c;想进一步深入了解其思想&#xff0c;所以学习了一些FP相关的知…

MFC中显示 .bmp格式的位图

最近在看VisualC 图像处理的书籍&#xff0c;表示一直在从基础做起&#xff0c;今天就记录一个简单功能的实现&#xff0c;显示.bmp格式的位图。 首先需要理解的是窗口创建的过程包括两个步骤&#xff1a;首先擦除窗口的背景&#xff0c;然后在对窗口进行重新绘制。 一般而言&a…

ibatis源码浅析- 初探

ibatis核心类 SqlMapExecutor&#xff1a;定义了数据库curd操作api SqlMapTransactionManager &#xff1a; 主要定义了事务管理功能 SqlMapClient&#xff1a;继承SqlMapExecutor, SqlMapTransactionManager接口 也就具有curd操作 事务管理行为 SqlMapSession&#xff1a; 它…

c语言中void跟argv,argc和argv []在C语言中

我学习C和在其中一个例子&#xff0c;我们写出这样的程序&#xff1a;argc和argv []在C语言中#include int main(int argc, char *argv[]){// go through each string in argvint i 0;while(i < argc){printf("arg %d: %s\n", i, argv[i]);i;}// lets make our o…

【转】apache常用配置

如何设 置请求等待时间在httpd.conf里面设置&#xff1a;  TimeOut n  其中n为整数&#xff0c;单位是秒。 如何接收一个get请求的总时间接收一个post和put请求的TCP包之间的时间  TCP包传输中的响应&#xff08;ack&#xff09;时间间隔 如何使得apache监听在特定的端口…

[20190402]对比_mutex_wait_scheme不同模式cpu消耗.txt

[20190402]对比_mutex_wait_scheme不同模式cpu消耗.txt--//前几天做了sql语句在mutexes上的探究.今天对比不同_mutex_wait_scheme模式cpu消耗.1.环境:SYSbook> hide mutexNAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE---------------…

【宋红康学习日记11】Object类与equals方法

1 &#xff08;1&#xff09;当对象是基本数据类型时&#xff0c;比较值&#xff1b; &#xff08;2&#xff09;当对象是引用型时&#xff0c;比较的是地址值&#xff01;&#xff01;1 2 equals&#xff08;&#xff09;&#xff1a;只处理引用型数据&#xff1b;Object类中…

C语言图书管理系统注册功能,图书管理系统的c语言源程序

/*****************************************************************************************/#include #include #include #include /输入/输出文件流类using namespace std;const int maxr100;/最多的读者const int maxb100;/最多的图书const int maxbor5;/每位读者最多借…

python三层架构

conf/setting(配置文件) 一般是对utility进行相关设置index(主文件)main函数触发某个对象的业务逻辑方法model(数据库)admin 是对数据库的操作&#xff0c;数据库的增删改查操作utility(公共功能)sql_helper操作数据库的方法(其实就是些连接数据库&#xff0c;关闭数据库等…

【转】对random_state参数的理解

转自&#xff1a;https://blog.csdn.net/az9996/article/details/86616668 在学习机器学习的过程中&#xff0c;常常遇到random_state这个参数&#xff0c;下面来简单叙述一下它的作用。作用&#xff1a;控制随机状态。 原因&#xff1a;为什么需要用到这样一个参数random_stat…

关于项目总结一下

最近在做两很多事情&#xff0c;总结一下 1、MySQL使用需要注意的地方1) 存储引擎选择InnoDB&#xff0c;在高并发下读写有很好的表现2) 数据合理分表分区&#xff0c;均衡各数据库服务器的负载3) 适当作数据的冗余&#xff0c;便于在cache失效时的快速恢复 2、Redis使用需要注…

鸿蒙系统能内测吗,鸿蒙系统内测用户:使用体验已经超越ios

首先&#xff0c;鸿蒙流畅度堪比iOS&#xff0c;如同德芙巧克力一样非常丝滑&#xff0c;各种界面切换毫无卡顿。鸿蒙是万物互联的基础&#xff0c;在与其他设备联动上&#xff0c;使用了freebuds pro和magic wathc2&#xff0c;状态栏就能直接切换耳机&#xff0c;非常顺畅&am…

19.04.02笔记

用户权限&#xff1a;su 切换用户账户格式&#xff1a;【su 用户名 】【su】 切换到root【su root】 切换到root【su -】 切换到root用户 同时切换到root目录添加组&#xff1a;【groupadd 组名】 添加组 需要用户权限删除组【groupdel 组名】 删除组 需要用户权限和清空组…

VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询

浏览localhost网站时候不管你打开那个页面它都会不停的轮询。据悉这是VS2013自带的Browser Link功能&#xff0c;里面用到SignalR机制什么是Browser Link功能&#xff0c;什么是SignalR机制大家可以没事去百度了解一下。Browser Link功能讲解地址&#xff1a;http://www.cxyclu…

编译型语言和解释型语言(转载)

在具体计算机上实现一种语言&#xff0c;首先要确定的是表示该语言语义解释的虚拟计算机&#xff0c;一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答&#xff0c;可以将程序设计语言划分为…

魅族手机使用鸿蒙系统,魅族宣布接入华为鸿蒙系统,这应该是黄章最正确的决定...

安卓能有现在的成就一切源于苹果之外其它所有品牌都在使用&#xff0c;俗话讲“众人拾柴火焰高”就是这个道理。相对来讲华为鸿蒙要想做大做强必须有其它品牌支持才可以&#xff0c;如果华为自己一家使用是无法做到与苹果的iOS、谷歌的安卓相抗衡的。这就是为什么华为鸿蒙正式确…

(转)互斥对象锁和临界区锁性能比较 .

在Win32平台上进行多线程编程&#xff0c;常会用到锁。下边用C实现了互斥对象&#xff08;Mutex&#xff09;锁和临界区&#xff08;CRITICAL_SECTION&#xff09;锁&#xff0c;以加深理解和今后方便使用。代码已在VS2005环境下编译测试通过。 Lock.h [cpp] view plaincopypri…

CentOS6.5 下sciki-learn numpy scipy 的安装

CentOS6.5 下sciki-learn numpy scipy 的安装软件安装CentOSPython之前用的一直是CentOS 7&#xff0c; 后来觉的软件安装太麻烦就改到了Ubuntu&#xff0c; 这些Python 的包在Ubuntu下安装几乎是无脑的&#xff0c;用apt-get 安装 Ipython 的时候会自动下载numpy, scipy 和 ma…

2021年甘肃省副高考试成绩查询,2021年甘肃卫生资格考试成绩查询-中国卫生人才网...

国家卫生资格考试网为您发布 2021年甘肃卫生资格考试成绩查询-中国卫生人才网&#xff0c;同步中国卫生人才网信息&#xff1a;2021甘肃卫生资格成绩查询。更多关于卫生资格成绩,卫生资格考试,2021卫生资格考试,国家卫生资格成绩查询的信息内容&#xff0c;请关注国家卫生资格考…

OWIN初探(转)

什么是 OWIN &#xff1f; OWIN 的全称是 "Open Web Interface for .NET"&#xff0c; OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口&#xff0c; 其目的是为了实现服务器与应用之间的解耦&#xff0c; 鼓励为 .NET Web 应用开发简单模块。 OWI…