前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shiro教程5(整合SSM项目-认证)

shiro教程5(整合SSM项目-认证)

作者头像
Java帮帮
发布2019-12-13 12:34:15
4030
发布2019-12-13 12:34:15
举报

搭建好SSM项目

这个之前已经讲过,参考之前案例整合教程

https://www.zhiya360.com/8125.html

项目中引入相关依赖

代码语言:javascript
复制
<!-- shiro相关的依赖 -->
<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-spring</artifactId>
	<version>1.2.3</version>
</dependency>
  <dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-ehcache</artifactId>
	<version>1.2.3</version>
</dependency>

web.xml文件中注册shiro过滤器

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>test</display-name>
	<!-- 这里配置Spring配置文件的位置,param-name是固定的, param-value是文件位置 这个配置可以省略,如果省略, 系统默认去/WEB-INF/目录下查找applicationContext.xml作为Spring的配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext-*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<filter>
		<filter-name>encoding</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceRequestEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>forceResponseEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- shiro过虑器,DelegatingFilterProxy通过代理模式将spring容器中的bean和filter关联起来 -->
	<filter>
		<filter-name>shiroFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<!-- 设置true由servlet容器控制filter的生命周期 -->
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
		<!-- 设置spring容器filter的bean id,如果不设置则找与filter-name一致的bean -->
		<init-param>
			<param-name>targetBeanName</param-name>
			<param-value>shiro</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>shiroFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 防止资源文件被spring MVC拦截 -->
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.jpg</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.js</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.css</url-pattern>
	</servlet-mapping>
</web-app>

添加shiro的配置文件

注意shiro的配置可以添加在spring的配置文件中。但是为了便于管理我们再单独创建一个shiro的配置文件,里面的Schema还是spring的。

同时web.xml文件中加载spring的位置也需要调整

applicationContext-shiro.xml中的内容:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
 
 	<!-- 定义凭证匹配器 -->
 	<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher" id="credentialsMatcher">
 		<!-- 配置散列算法 -->
 		<property name="hashAlgorithmName" value="md5"/>
 		<!-- 配置散列次数 -->
 		<property name="hashIterations" value="2"/>
 	</bean>
 	
 	<!-- 注册自定义Realm -->
 	<bean class="com.dpb.realm.MyRealm" id="myRealm">
 		<!-- 配置凭证匹配器 -->
 		<property name="credentialsMatcher" ref="credentialsMatcher"/>
 	</bean>
 	
 	<!-- 注册SecurityManager -->
 	<bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" id="securityManager">
 		<!-- 配置自定义Realm -->
 		<property name="realm" ref="myRealm"/>
 	</bean>
 	
 	<!-- 注册ShiroFilterFactoryBean 注意id必须和web.xml中注册的targetBeanName的值一致 -->
 	<bean class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" id="shiro">
 		<!-- 注册SecurityManager -->
 		<property name="securityManager" ref="securityManager"/>
 		<!-- 登录地址 如果用户请求的的地址是 login.do 那么会对该地址认证-->
 		<property name="loginUrl" value="/login.do"/>
 		<!-- 登录成功的跳转地址 -->
 		<property name="successUrl" value="/jsp/success.jsp"/>
 		<!-- 访问未授权的页面跳转的地址 -->
 		<property name="unauthorizedUrl" value="/jsp/refuse.jsp"/>
 		<!-- 设置 过滤器链 -->
 		<property name="filterChainDefinitions">
 			<value>
 				<!--加载顺序从上往下。
 					authc需要认证
 					anon可以匿名访问的资源
 				 -->
 				/login.do=authc
 				/**=anon
 			</value>
 		</property>
 	</bean>
</beans>

创建自定义的realm

完成service和mapper

完成realm的认证功能

代码语言:javascript
复制
/**
 * 认证方法
 *
 * @param token
 *            就是我们在测试代码中 定义的UsernamePasswordToken对象 有我们保存的需要验证的账号密码信息
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
	// 获取账号信息
	String principal = (String) token.getPrincipal();
	// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456
	// 验证账号
	Users user = userService.login(principal);
	if (user == null) {
		return null;
	}
	// 获取密码
	String pwd = user.getPassword();
	// 获取盐值
	ByteSource bs = ByteSource.Util.bytes(user.getSalt());
	// 验证密码
	AuthenticationInfo info = new SimpleAuthenticationInfo(principal
			, pwd, bs, "myrealm");
	return info;
}

完成controller

代码语言:javascript
复制
/**
 * 认证方法
 *
 * @param token
 *            就是我们在测试代码中 定义的UsernamePasswordToken对象 有我们保存的需要验证的账号密码信息
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
	// 获取账号信息
	String principal = (String) token.getPrincipal();
	// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456
	// 验证账号
	Users user = userService.login(principal);
	if (user == null) {
		return null;
	}
	// 获取密码
	String pwd = user.getPassword();
	// 获取盐值
	ByteSource bs = ByteSource.Util.bytes(user.getSalt());
	// 验证密码
	AuthenticationInfo info = new SimpleAuthenticationInfo(principal
			, pwd, bs, "myrealm");
	return info;
}

准备数据

login.jsp

代码语言:javascript
复制
<form action="login.do" method="post">
	账号:<input type="text" name="username" ><br/>
	密码:<input type="password" name="password"><br/>
	<input type="submit" value="提交">
</form>

测试

账号错误

密码错误

账号密码正确的情况

执行的原理过程

文字描述

1.客户端提交的请求到来的时候,首先过滤器会判断该请求是否可以匿名访问,如果不可以,则判断当前是否是登录状态,如果不是就会跳转到如下地址中:

2.如果用户请求的是可以匿名访问的地址,比如login.jsp那么服务器就会直接响应该请求

3.如果请求的地址是 login.do那么该请求会被过滤器拦截,并进行登录认证。因为该请求我们特别配置了

FormAuthenticationFilter该过滤器会获取表单提交的内容,

4.认证出错,需要表单提交的账号和密码为username和password。 之后会被我们自定义的Realm认证,如果认证出错,会将错误信息保存在request作用域中key为shiroLoginFailure,

并跳转到controller的login.do方法中。

5.认证成功,会跳转到我们指定的成功页面,

内置过滤器介绍

内置过滤器对应关系

内置过滤器说明

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 搭建好SSM项目
  • 项目中引入相关依赖
  • web.xml文件中注册shiro过滤器
  • 添加shiro的配置文件
  • 创建自定义的realm
  • 完成service和mapper
  • 完成realm的认证功能
  • 完成controller
  • 准备数据
  • 测试
    • 账号错误
      • 密码错误
        • 账号密码正确的情况
        • 执行的原理过程
          • 文字描述
          • 内置过滤器介绍
            • 内置过滤器对应关系
              • 内置过滤器说明
              相关产品与服务
              访问管理
              访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档