shiro一,自定义realm

(springboot)shiro安全框架自定义过滤器出现的几个疑难杂症解决方案 问题一:多次重复重定向问题(匹配多个过滤器链重复调用其对应过滤器) 问题二:shiro认证时Realm会执行两次 在使用springboot框架整合shiro安全认证框架时踩了很多坑,每次出问题网上都找不到其中的解决方案,这里贴两个我遇到的坑,以及其解决方案给大家,希望大家可以少走弯路。 问题一场景: // 自定义拦截器 Map<String, Filter> cus... 阅读详情

话不多直接上代码:

@RequestMapping("/login")
	public String login(Blogger blogger,HttpServletRequest request){
		//System.out.println("BloggerController.login()......");
		Subject subject = SecurityUtils.getSubject();//获得当前登录用户
		UsernamePasswordToken token = new UsernamePasswordToken(blogger.getUserName(), CryptographyUtil.md5(blogger.getPassword(), "gcc"));
		try {
			subject.login(token);//身份认证,这时会调用自定义realm
			return "redirect:/admin/main.jsp";
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("blogger", blogger);//回显用户名和密码
			request.setAttribute("errorInfo", "用户名或者密码错误");
			return "login";
		}
	}

在shiro的官方API文档中,案例是以.ini文件来举例的,通过shiro的核心securityManager实例在读取配置文件的内容。如果我们希望通过数据库,并且自定义是什么表请往下看。

这里第四行代码,通过SecurityUtils类得到当前交互对象,一般就是登录的用户

第五行代码,将从页面获取的用户名和密码封装到一个token令牌中

try内的一行代码,对当前交互对象进行登录操作,执行login方法,下面就是关键,这时会执行如下代码:

/**
 * 自定义realm
 * @author gcc
 */
public class MyRealm extends AuthorizingRealm {
	
	@Resource
	private BloggerService bloggerService; 
	
	//为当前登录用户授予角色权限
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {		
		return null;
	}
	//验证当前登录用户
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		String userName=(String) token.getPrincipal();
		Blogger blogger = bloggerService.getByUserName(userName);
		if (blogger!=null) {
			SecurityUtils.getSubject().getSession().setAttribute("currentUser", blogger);//把当前用户信息放入session
			//AuthenticationInfo的第二个参数是数据库密码,内部实现会比对token的密码,如果错误,会返回报错信息, 在login()方法catch,页面提示错误
			AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(blogger.getUserName(), blogger.getPassword(), "xx");//realname可以是随意的字符串
这里我们自定义了一个realm,并且继承抽象类AuthorizingRealm,因为是抽象类,就必须实现内部存在的抽象方法,这里有两个,其中优先执行第二个。

我们来说明第二个类做了什么,首先他拿到了刚刚封装的token令牌,里面有用户名和密码,根据规范这里用来获取用户名。再之后就是自定义方法,通过用户名去自己定义的数据库和表中查询得到用户实体。到这一步心情突然好了吧,看你成功了一半了!

如果查询结果存在,则将用户信息放入session,这里可能思维敏捷的人发现了什么,我只是得到用户,但没有校验密码,怎么就能把信息放入session呢?这里记(问题一)

我们先往下看,将查询得到的用户名和密码交给授权信息这个构造方法,然后java封装的伟大就出现了,我们不用关心这个构造方法具体怎么做,我只要知道他会干什么。

这个构造方法会核对数据库得到的数据和token内的数据是否匹配,匹配就悄悄离开,否则例如密码错误,就会报错。而这个错误会通过throws往上抛出,被我们的catch抓到。这时可以在catch里做出补救措施,比如返回原先的用户名密码,提示错误,返回到登陆界面等等,也就解释了(问题一),既然会catch,放session也没事。

然后恍然大悟,哦,这个方法走完了。

之后是此类的第一个方法,用于获取角色和权限,这里暂时略过。再之后就是第一处代码中的登录成功,跳转页面,程序结束。

Stop!到这里是不是应该问,shiro怎么知道要走Myrealm!

这里环境是spring下,配置如下:

在web.xml中做以下配置:

<!-- shiro过滤器定义 -->
	<filter>  
	    <filter-name>shiroFilter</filter-name>  
	    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
    <init-param>  
    <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->  
    <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>
在applicationContext配置:

<!-- 自定义Realm -->
	<bean id="myRealm" class="com.gcc.realm.MyRealm"/>  
	
	<!-- 安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  	  <property name="realm" ref="myRealm"/>  
	</bean>  
	
	<!-- Shiro过滤器 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
	    <!-- Shiro的核心安全接口,这个属性是必须的 -->
	    <property name="securityManager" ref="securityManager"/>
	    <!-- 身份认证失败,则跳转到登录页面的配置 -->  
	    <property name="loginUrl" value="/login.jsp"/> 
	    <!-- Shiro连接约束配置,即过滤链的定义 -->  
	    <property name="filterChainDefinitions">  
	        <value>
				/login=anon
				/admin/**=authc
	        </value>  
	    </property>
	</bean>  
	
	<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->  
	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>  
	
	<!-- 开启Shiro注解 -->
	<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>

配置我全给了哦,这里我们只关心一部分。

web的配置是对所有路径都进行shiro的过滤,就是说不管你是啥路径,都要被shiro检查校验。

app配置文件上半部分很好理解,也是我们关心的,这里我们定义了bean,给出了myrealm路径,shiro的默认web securityManager读到这个路径,然后就执行了我们的自定义realm。

再往下则是刚刚略过的角色和权限认证的配置,见代码中说明,这里单独介绍下权限的过滤,如/login路径下方法不用通过角色也权限认证就能执行,anon就是这个意思。再如/admin/*路径下需要进行角色认证,authc就是这个意思。其它关键字大伙自个查api。

一旦走权限认证就会执行之前我略过没有说明的方法,这里进行说明(代码不是一体的,我另一个demo中的)

/**
	 * 为当前登录的用户授予角色和权限
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		String userName=(String)principals.getPrimaryPrincipal();
		SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
		Connection con=null;
		try{
			con=dbUtil.getCon();
			authorizationInfo.setRoles(userDao.getRoles(con,userName));
			authorizationInfo.setStringPermissions(userDao.getPermissions(con,userName));
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				dbUtil.closeCon(con);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return authorizationInfo;
	}
简单易懂吧,我们通过dao方法查询得到权限和角色,然后交给授权信息实体,这里提醒一下,角色和权限的数据类型是set,取值最好有hashSet。

然后我们就可以这样用:

@RequiresPermissions("sys:sysPosition:view")
	@RequestMapping(value = {"list", ""})
	public String list(SysPosition sysPosition, HttpServletRequest request, HttpServletResponse response, Model model) {
		Page<SysPosition> page = sysPositionService.findPage(new Page<SysPosition>(request, response), sysPosition); 
		model.addAttribute("page", page);
		return "modules/sys/sysPositionList";
	}
这里关键看第一行,通过注解得到当前登录对象的权限,如果有则执行方法,没有就返回提示信息。

也可以jsp中这样用:

<div class="form-actions">
			<shiro:hasPermission name="sys:menu:edit"><input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/> </shiro:hasPermission>
			<input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
		</div>

通过标签来让内容是否显示。

大功告成,简单的说明就到这里,内容有误的欢迎指出,谢谢了,各位同道中人!














折叠式共源共栅放大器设计/备忘 w折叠式共源共栅基本结构如图 阅读详情

相关推荐

细聊Oracle通过ODBC数据源连接SQL Server数据库

    类似文章搜索引擎上有很多,内容大致相同,今天所谓细聊是因为我在借鉴这些文章时候走了些弯路,所以写此文,为自己备忘,同时如果能为初涉此处知识点的小伙伴提供些帮助就更好了,废话不多说。    我的应用场景:    项目系统使用oracle数据库,与客户的第三方系统供应商实现资源共享,对方为sql server数据库;    我的测试开发环境为64bitwin7PC机,本机上装有64位Oracl...

xueren_83的博客 1万+

基于Spring框架的Shiro配置

一、在web.xml中添加shiro过滤器 &lt;!-- Shiro filter--&gt;    &lt; filter &gt;        &lt; filter-name &gt; shiroFilter &lt;/ filter-name &gt;        &lt; filter-class &g...

nrain01的专栏 197

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份IEC61850通信协议从理论到实践的完整测试验证实战指南。针对MMS、GOOSE、SV三大核心协议,详细阐述了测试环境搭建、自动化脚本编写、性能与异常测试方法,并分享了常见避坑经验,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备在现场的互联互通与稳定可靠运行。

neovim7hacker的博客 155

shiro学习(2):第一个shiro程序

工具idea 首先创建maven项目 配置文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati...

歌谣的博客 463

广告推荐算法 - 学习笔记(持续更新中)

本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。

qq_39748832的博客 2197

逻辑电平(TTL/CMOS/LVDS/LVPECL/CML)

逻辑电平介绍 TTL------晶体管-晶体管逻辑门(Transistor-Transistor Logic gate) TTL采用5V电源

sinat_15677011的博客 2万+

ssm和shiro整合,shiro的自定义的realm不能自动注入的问题

在自定义realm的时候注入的时候就会报错,去掉注解@Autowired 运行就会没有问题。错误的原因应该在于注解无法注入@Autowiredprivate UserService userService;// 设置realm的名称@Overridepublic void setName(String name) {super.setName("customRealm");}这是eclipse报的...

Architect_优快云的博客 1583

cartographer ceres后端优化

这里引用一篇文章作用一:用户可以选择使用Problem::AddParameterBlock显式添加参数块;在显式添加的时候ceres会内部进行额外的正确性检查。当Problem::AddParameterBlock()不存在时,Problem::AddResidualBlock()会隐式添加参数块,因此不需要显式调用Problem::AddParameterBlock()函数。ps:类似构造函数,显式构造函数。

南北粉面馆 802

apache-shiro杂记(二) 关于多realm认证的策略

一直以为给定的下面配置是短路方式的,即defaultJdbcRealm可以成功认证,backDoorJdbcRealm就不会被调用。 其实不然,org.apache.shiro.authc.pam.FirstSuccessfulStrategy并不是这个意思,所有的realm依然都会被调用。 只不过是第一个认证成功的AuthenticationInfo作为最后的结果返回。 [code="xm...

马勒・格・彼得 327

神经影像和人类基因组关联分析的实践过程

现代全脑转录图谱为研究脑组织的分子相关性提供了前所未有的机会,可以使用无创神经成像进行量化。然而,将神经影像学数据与转录组测量相结合并不是直截了当的,需要仔细考虑才能做出有效的推断。在本文中,我们回顾了最近的研究工作,探讨了不同的方法选择如何影响成像转录组学分析的三个主要阶段,包括1)转录图谱数据的处理;2)将转录测量与独立衍生的神经影像学表型相关联;3)通过基因富集分析评估鉴定的关联的功能意义。我们的目标是为这个快速发展的领域促进标准化和可复制方法的发展。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2201

不会路由器叠加多条宽带?看这个就够了,能让你的局域网速度更快!

通常我们在企业网络或实际项目中,随着用户的增加,一条或者几条带宽不能满足正常使用,便可以对带宽进行叠加,便于网络带度更快;通常家里有可能有两条带宽的,联通或移动的,可能都是充话费送的,但网速都不怎么样,不用可惜,用之委屈,那怎么办呢?如在迅雷上开启下载,多个资源同时下载,此时总带宽可以达到120M,也就是WAN口带宽可以叠加。多wan口路由器, 一般是有2个wan口,分别为wan1与wan2。当然也有更多的wan口的。[1] 对整个局域网来说,出口带宽数量多了,相当于总带宽上升,这样是可以起到叠加效果。

qq_43416206的博客 1112

Shiro 框架

Shiro简介 SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。 Authentication:身份认证/登录,验证用户是不是拥有相应的身份; Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个...

旺仔 680

华为OD机试真题 新系统 2026-04-22 C++ 实现【小学生班长选举增强版】

9 月份开学第一天,小学某班级进行班长选举活动,班级共有 N 个学生,每个学生最多可投 3 票(对同一个人只能投一票),也可以弃权不投票,大家投票时写上对应学生的名字。 假设学生不存在重名。考虑到部分少数民族名字带分隔,且整体较长,同学在投票时为了方便,允许同学写全称,也可以只写其中的部分连续段。 例如班级里只有 2 个少数民族名称带点的同学:

MISAYAONE的博客 167

一篇适合小白的Shiro教程

Shiro的基本使用Shiro简介什么是ShiroShiro核心架构SubjectSecurityManagerAuthenticatorAuthorizerRealmSessionManagerSessionDAOCacheManagerCryptographyShiro中的认证什么是认证三个概念SubjectPrincipalcredential认证的实现Shiro认证的源码分析Shiro使用自定义Relam实现认证CustomerRealmCustomerRealmAuthenticatorTest测

潮汐先生的专栏 6万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

shiro自定义Realm时发生异常

错误1:org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [cn.itsource.crm.shiro.util.CrmToken - 061HqmnI0EJ1lg28fwmI0jFrnI0Hqmnt, rememberMe=false]. Possible une...

Bamboo_kai的博客 3693

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringBoot+Shiro实现免密登录(多个realm)

业务需求:因目前系统已经集成shiro根据用户名和密码加盐加密后校验用户登录信息功能的前提下需要集成第三方单点登陆功能。根据业务需求校验通过单点登陆后进入该项目的时候通过用户名实现免密登陆。 思路:原始已完成了用户名密码登陆功能,并自定义了AuthorizingRealm实现doGetAuthenticationInfo、doGetAuthorizationInfo登陆验证和授权功能。新的...

wmy_0707的博客 2126

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

shiro的自定义的realm无法装配service

文章目录shiro的自定义的realm无法装配service解决办法1. 改变自己的加载顺序,像是其他博客写的那样。2. 如果你弄了一天都没法明白,那么相信自己没有出错的情况下,请把文件复制到一个正确的能启动的ssm项目中,你会发现,他能够正常运行了。下面是我亲身经历的对比,,让人无解的难题 shiro的自定义的realm无法装配service 在控制台会报错,自定义的realm 无法装配成功,...

Firewine 的博客 390

Shiro认证(Authentication)

Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、会话管理和加密等功能。对于任意一个应用程序,Shiro都可以提供全面的安全管理服务,对比Spring Security,可能没有Spring Security功能强大,但是完美在实际工作中可能不需要那么复杂的功能,所以使用简单易用的Shiro就已经足够了。@Resource@OverrideSystem.out.println("调用MyShiroRealm.doGetAuthorizationInfo获取权限信息!");

Bisikl的博客 1221

Spring Boot 整合 Shiro,两种方式全总结

在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 一般来说,Spring Security 和 Shiro 的比较如下: Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架 Spring Security 概念复杂,配置繁琐;Shiro 概念简单、...

qq_16436555的博客 187

Shiro学习(一):Shiro介绍和基本使用

Shiro 的设计目标是简化企业级应用程序的安全性开发过程,同时保持代码的简洁和易于维护。1)IniRealm:基于 .ini文件的配置,从Shiro.ini读取用户 认证/授权 和 角色数据。Realm,安全数据源, 是连接Shiro 与 安全数据的桥梁(如:JDBC数据库数据、LADP、SimpleAccountRealm是Shiro 提供的一个最基本的 Realm 内存实现,适用于快速原型开发。SecurityManager 是Shrio 的核心,管理所有的安全操作,协调所有安全组件,

liang8999的博客 1525

shiro 05

1、shiro简介 1.1是什么 Apache Shiro是一个强大且易用的Java安全框架,有身份验证、授权、密码学和会话管理四大基石。 securityManager:核心对象 realm:获取数据接口 Spring security 重量级安全框架,细粒度 Apache Shiro轻量级安全框架,粗粒度 1.2shiro能干什么 Authentication:身份验证(登陆) Authori...

weixin_44858201的博客 210

Shiro Realm 自动注入失败

先上问题 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) authenticationToken; Stri

m0_67401270的博客 204

Springboot集成shiro框架两种两种方式

Springboot集成shiro框架两种两种方式

m0_62639693的博客 314

Shiro的理解

实现@Autowired// 授权:查询用户的角色和权限@Override// 从数据库查询用户的角色、权限// 添加角色// 添加权限// 认证:查询用户信息(账号、密码)@Override// 从数据库查询用户throw new UnknownAccountException("账号不存在");// 返回认证信息(账号、密码、盐、Realm名称)username,getName()若默认过滤器不够用(如自定义权限逻辑、记录操作日志),可写。

m0_74776907的博客 1003

springboot shiro整合_Springboot整合Shiro之授权

一、注解的使用方式1.配置类修改  在权限校验的时候,我们一般在控制中通过注解来实现权限的校验,但我们需要放开注解的使用,在配置文件中的使用方式如下: 对应的在配置类中的设置如下: 2.自定义realm方法在自定义的realm中实现授权方法3.业务处理我们创建UserController,对相关的不同方法设置不同的访问权限,如下4.测试访问’/user/query’有权限,访问’/user/upd...

weixin_39713317的博客 58

shiro在web中实现授权的两种方式

配置xml文件的方式 在shiro的主配置文件中配置授权信息 当前用户有哪些授权信息从自定义的realm中读取 @Autowired private UserService userService; //获取授权信息 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection prin...

常军凯的博客 800
上一篇: java虚拟机(二,虚拟机中对象创建过程)
下一篇: java解惑学习经历(一)
gcc_front
博客等级 码龄9年 16粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值