shiro 之 认证登录的demo

1 shiro登录的简单demo

1.1 web.xml添加shiroFilter

<!-- shiro过虑器,DelegatingFilterProx会从spring容器中找shiroFilter -->

<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>

1.2 applicationContext-shiro.xml

<!-- Shiro 的Web过滤器 -->

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

<property name="securityManager" ref="securityManager" />

<!-- 如果没有认证将要跳转的登陆地址,http可访问的url,如果不在表单认证过虑器FormAuthenticationFilter中指定此地址就为身份认证地址 -->

<property name="loginUrl" value="/login.action" />

<!-- 没有权限跳转的地址 -->

<property name="unauthorizedUrl" value="/refuse.jsp" />

<!-- shiro拦截器配置 -->

<property name="filters">

<map>

<entry key="authc" value-ref="formAuthenticationFilter" />

</map>

</property>

<property name="filterChainDefinitions">

<value>

<!-- 必须通过身份认证方可访问,身份认 证的url必须和过虑器中指定的loginUrl一致 -->

/loginsubmit.action = authc

<!-- 退出拦截,请求logout.action执行退出操作 -->

/logout.action = logout

<!-- 无权访问页面 -->

/refuse.jsp = anon

<!-- roles[XX]表示有XX角色才可访问 -->

/item/list.action = roles[item],authc

/js/** anon

/images/** anon

/styles/** anon

<!-- user表示身份认证通过或通过记住我认证通过的可以访问 -->

/** = user

<!-- /**放在最下边,如果一个url有多个过虑器则多个过虑器中间用逗号分隔,如:/** = user,roles[admin] -->

</value>

</property>

</bean>

<!-- 安全管理器 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<property name="realm" ref="userRealm" />

</bean>

<!-- 自定义 realm -->

<bean id="userRealm" class="cn.itcast.ssm.realm.CustomRealm1">

</bean>

<!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->

<bean id="formAuthenticationFilter"

class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">

<!-- 表单中账号的input名称 -->

<property name="usernameParam" value="usercode" />

<!-- 表单中密码的input名称 -->

<property name="passwordParam" value="password" />

<!-- <property name="rememberMeParam" value="rememberMe"/> -->

<!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->

<property name="loginUrl" value="/loginsubmit.action" />

</bean>

securitymanager:这个属性是必须的

loginUrl:没有登录认证的用户请求将跳转到此地址,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的“/login.jsp”页面

unanthorizedUrl:没有权限默认跳转的页面

1.3 使用shiro注解授权

在springmvc.xml中配置shiro注解支持,可在controller方法中使用shiro注解配置权限:

<!-- 开启aop,对类代理 -->

<aop:config proxy-target-class="true"></aop:config>

<!-- 开启shiro注解支持 -->

<bean

class="

org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">

<property name="securityManager" ref="securityManager" />

</bean>

修改Controller代码,在方法上添加授权注解,如下:

// 查询商品列表

@RequestMapping("/queryItem")

@RequiresPermissions("item:query")

public ModelAndView queryItem() throws Exception {

上边代码@RequiresPermissions(“item:query”)表示必须拥有“item:query”权限方可执行。

1.4 退出

由于使用shiro的sessionManager,不用开发退出功能,使用shiro的logout拦截器即可。

<!-- 退出拦截,请求logout.action执行退出操作 -->

/logout.action = logout

1.5 缓存

shiro每个授权都会通过realm获取权限信息,为了提高访问速度需要添加缓存,第一次从realm中读取权限数据,之后不再读取,这里Shiro和Ehcache整合。

1.5.1 配置

在applicationContext-shiro.xml中配置缓存管理器

<!-- 安全管理器 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<property name="realm" ref="userRealm" />

<property name="sessionManager" ref="sessionManager" />

<property name="cacheManager" ref="cacheManager"/>

</bean>

<!-- 缓存管理器 -->

<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">

</bean>

1.5.2 session管理

在applicationContext-shiro.xml中配置sessionManager:

<!-- 安全管理器 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<property name="realm" ref="userRealm" />

<property name="sessionManager" ref="sessionManager" />

</bean>

<!-- 会话管理器 -->

<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">

<!-- session的失效时长,单位毫秒 -->

<property name="globalSessionTimeout" value="600000"/>

<!-- 删除失效的session -->

<property name="deleteInvalidSessions" value="true"/>

</bean>

1.6 验证码

需要在验证账号和名称之前校验验证码。

public class MyFormAuthenticationFilter extends FormAuthenticationFilter {

protected boolean onAccessDenied(ServletRequest request,

ServletResponse response, Object mappedValue) throws Exception {

// 校验验证码

// 从session获取正确的验证码

HttpSession session = ((HttpServletRequest)request).getSession();

//页面输入的验证码

String randomcode = request.getParameter("randomcode");

//从session中取出验证码

String validateCode = (String) session.getAttribute("validateCode");

if (!randomcode.equals(validateCode)) {

// randomCodeError表示验证码错误

request.setAttribute("shiroLoginFailure", "randomCodeError");

//拒绝访问,不再校验账号和密码

return true;

}

return super.onAccessDenied(request, response, mappedValue);

}

}

修改applicationContext-shiro.xml中对FormAuthenticationFilter的配置。

<bean id="formAuthenticationFilter"

class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">

改为

<bean id="formAuthenticationFilter"

class="cn.itcast.ssm.shiro.MyFormAuthenticationFilter">

1.7 记住我

用户登录选择“自动登录”本次登录成功会向cookie写身份信息,下次登录从cookie中取出身份信息实现自动登录。

向cookie记录身份信息需要用户身份信息对象实现序列化接口。

1.7.1 配置

<!-- 安全管理器 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<property name="realm" ref="userRealm" />

<property name="sessionManager" ref="sessionManager" />

<property name="cacheManager" ref="cacheManager"/>

<!-- 记住我 -->

<property name="rememberMeManager" ref="rememberMeManager"/>

</bean>

<!-- rememberMeManager管理器 -->

<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">

<property name="cookie" ref="rememberMeCookie" />

</bean>

<!-- 记住我cookie -->

<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">

<constructor-arg value="rememberMe" />

<!-- 记住我cookie生效时间30天 -->

<property name="maxAge" value="2592000" />

</bean>

修改formAuthenticationFitler添加页面中“记住我checkbox”的input名称:

<bean id="formAuthenticationFilter"

class="cn.itcast.ssm.shiro.MyFormAuthenticationFilter">

<!-- 表单中账号的input名称 -->

<property name="usernameParam" value="usercode" />

<!-- 表单中密码的input名称 -->

<property name="passwordParam" value="password" />

<property name="rememberMeParam" value="rememberMe"/>

<!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->

<property name="loginUrl" value="/loginsubmit.action" />

</bean>

时间: 2024-07-30 10:20:47

shiro 之 认证登录的demo的相关文章

Java秒杀系统实战系列~整合Shiro实现用户登录认证

摘要: 本篇博文是"Java秒杀系统实战系列文章"的第五篇,在本篇博文中,我们将整合权限认证-授权框架Shiro,实现用户的登陆认证功能,主要用于:要求用户在抢购商品或者秒杀商品时,限制用户进行登陆!并对于特定的url(比如抢购请求对应的url)进行过滤(即当用户访问指定的url时,需要要求用户进行登陆). 内容: 对于Shiro,相信各位小伙伴应该听说过,甚至应该也使用过!简单而言,它是一个很好用的用户身份认证.权限授权框架,可以实现用户登录认证,权限.资源授权.会话管理等功能,在本

springboot,vue,shiro整合 关于登录认证功能

首先是session问题 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用户名和密码来进行认证.当浏览器第一次访问服务器(假设是登录接口),服务器验证用户名和密码之后,服务器会生成一个sessionid(只有第一次会生成,其它会使用同一个sessionid),并将该session和用户信息关联起来,然后将sessionid返回给浏览器,浏览器收到sessionid保存到C

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)基于SpringMVC+Shiro的用户登录权限验证

序: 在上一篇中,咱们已经对于项目已经做了基本的配置,这一篇文章开始学习Shiro如何对登录进行验证. 教学: 一.Shiro配置的简要说明. 有心人可能注意到了,在上一章的applicationContext.xml配置文件中,包含以下配置. <!-- 項目自定义的Realm --> <bean id="shiroDbRealm" class="org.shiro.demo.service.realm.ShiroDbRealm" ><

Shiro权限控制框架入门1:Shiro的认证流程以及基本概念介绍

前言:我在最开始学习Shiro这个框架时,在网上搜索到的一个介绍比较全面的教程是:<跟我学Shiro>系列教程.但是在我看了他写的前几篇文章后,我发现虽然他在这个系列教程中把shiro的一些特性介绍地非常全面详细,但是整个教程的叙述方式还是有很大缺陷的.文章与文章之间并没有很好地串联起来,每篇文章介绍的东西都过于分散了,如果是对shiro完全不了解的新手来看的话完全是一场噩梦.就像一个网友评价的这样: 看了看这个教程,看完之后都想放弃shiro了,完全看不懂,后来百度了很多别的资料才理解了sh

cas+tomcat+shiro实现单点登录-4-Apache Shiro 集成Cas作为cas client端实现

目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas client端实现 Apache Shiro 集成Cas作为cas client端实现 第一步.添加maven依赖 <!-- shiro依赖包 --> <!-- <dependency> <groupId>org.apache.shiro</groupId> &

Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)

一.术语介绍 Authentication:身份认证,即用户提供一些信息来证明自己的身份.如用户名和密码,licence等. Principals :主体的"标识属性",可以是任意标识,例如用户名,身份证号码,手机号码等.Principals 可以有多个,但是必须有一个主要的Principal(Primary Principal),这个标识,必须是唯一的. Credentials:凭据,即只有主体知道或具有的秘密值,例如密码或数字证书,或者某些生物特征,例如指纹,视网膜等. Princ

003 Shiro的认证

一 . 概述 认证:简单说就是登录,用户携带账号和密码信息通过Subject对象与shiro进行交互,看用户的身份凭证是否正确. 本节需要演示认证的流程. 二 .搭建环境 本次使用ini充当Realm对象,使用IniSecurityManager充当SecurityManager对象,这个在后面我们都会重写进行定制的,这里只是简单介绍流程. 我们的ini文件的内容: [users] trek=123 这个ini文件之中,定义了一个账号为trek,密码为123的用户. 三 .流程代码 //实现sh

2、Shiro的认证

Shiro的认证流程大体可以参考下面这幅图: 但是没有接触过shiro的同学看到上面的图片也不明白,下面我们来在代码中尝试体验Shiro的认证过程: 1.新建一个SpringBoot项目项目结构如下: ShiroframeApplicationTests代码: package com.shiro.shiroframe; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToke

Shiro身份认证、盐加密

目的: Shiro认证 盐加密工具类 Shiro认证 1.导入pom依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.s