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

搭建好SSM项目

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

项目中引入相关依赖


<dependency>
\t<groupid>org.apache.shiro/<groupid>
\t<artifactid>shiro-spring/<artifactid>
\t<version>1.2.3/<version>
/<dependency>
<dependency>
\t<groupid>org.apache.shiro/<groupid>
\t<artifactid>shiro-ehcache/<artifactid>
\t<version>1.2.3/<version>
/<dependency>

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


<web-app>\txmlns="http://java.sun.com/xml/ns/javaee"
\txsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
\tid="WebApp_ID" version="3.0">
\t<display-name>test/<display-name>
\t
\t<context-param>
\t\t<param-name>contextConfigLocation/<param-name>
\t\t<param-value>classpath:applicationContext-*.xml/<param-value>
\t/<context-param>
\t<listener>
\t\t<listener-class>org.springframework.web.context.ContextLoaderListener/<listener-class>
\t/<listener>
\t<servlet>
\t\t<servlet-name>springmvc/<servlet-name>
\t\t<servlet-class>org.springframework.web.servlet.DispatcherServlet/<servlet-class>
\t\t<init-param>
\t\t\t<param-name>contextConfigLocation/<param-name>
\t\t\t<param-value>classpath:spring-mvc.xml/<param-value>
\t\t/<init-param>
\t/<servlet>
\t<servlet-mapping>
\t\t<servlet-name>springmvc/<servlet-name>

\t\t<url-pattern>//<url-pattern>
\t/<servlet-mapping>
\t<filter>
\t\t<filter-name>encoding/<filter-name>
\t\t<filter-class>org.springframework.web.filter.CharacterEncodingFilter/<filter-class>
\t\t<init-param>
\t\t\t<param-name>encoding/<param-name>
\t\t\t<param-value>UTF-8/<param-value>
\t\t/<init-param>
\t\t<init-param>
\t\t\t<param-name>forceRequestEncoding/<param-name>
\t\t\t<param-value>true/<param-value>
\t\t/<init-param>
\t\t<init-param>
\t\t\t<param-name>forceResponseEncoding/<param-name>
\t\t\t<param-value>true/<param-value>
\t\t/<init-param>
\t/<filter>
\t<filter-mapping>
\t\t<filter-name>encoding/<filter-name>
\t\t<url-pattern>/*/<url-pattern>
\t/<filter-mapping>

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

\t<servlet-mapping>
\t\t<servlet-name>default/<servlet-name>
\t\t<url-pattern>*.jpg/<url-pattern>
\t/<servlet-mapping>
\t<servlet-mapping>
\t\t<servlet-name>default/<servlet-name>
\t\t<url-pattern>*.js/<url-pattern>
\t/<servlet-mapping>
\t<servlet-mapping>
\t\t<servlet-name>default/<servlet-name>
\t\t<url-pattern>*.css/<url-pattern>
\t/<servlet-mapping>
/<web-app>

添加shiro的配置文件

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

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

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

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

applicationContext-shiro.xml中的内容:


<beans>\txmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\txmlns:context="http://www.springframework.org/schema/context"
\txmlns:aop="http://www.springframework.org/schema/aop"
\txsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
\t\thttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

\t
\t<bean>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t/<bean>
\t
\t
\t<bean>
\t\t
\t\t<property>
\t/<bean>
\t
\t
\t<bean>
\t\t
\t\t<property>
\t/<bean>
\t
\t
\t<bean>
\t\t

\t\t<property>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t\t\t<value>
\t\t\t\t
\t\t\t\t/login.do=authc
\t\t\t\t/**=anon
\t\t\t/<value>
\t\t/<property>
\t/<bean>
/<beans>

创建自定义的realm

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

完成service和mapper

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

完成realm的认证功能

/**
* 认证方法
*
* @param token
* 就是我们在测试代码中 定义的UsernamePasswordToken对象 有我们保存的需要验证的账号密码信息
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
\t// 获取账号信息

\tString principal = (String) token.getPrincipal();
\t// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456
\t// 验证账号
\tUsers user = userService.login(principal);
\tif (user == null) {
\t\treturn null;
\t}
\t// 获取密码
\tString pwd = user.getPassword();
\t// 获取盐值
\tByteSource bs = ByteSource.Util.bytes(user.getSalt());
\t// 验证密码
\tAuthenticationInfo info = new SimpleAuthenticationInfo(principal
\t\t\t, pwd, bs, "myrealm");
\treturn info;
}

完成controller

/**
* 认证方法
*
* @param token
* 就是我们在测试代码中 定义的UsernamePasswordToken对象 有我们保存的需要验证的账号密码信息
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
\t// 获取账号信息
\tString principal = (String) token.getPrincipal();
\t// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456
\t// 验证账号
\tUsers user = userService.login(principal);
\tif (user == null) {
\t\treturn null;
\t}
\t// 获取密码
\tString pwd = user.getPassword();

\t// 获取盐值
\tByteSource bs = ByteSource.Util.bytes(user.getSalt());
\t// 验证密码
\tAuthenticationInfo info = new SimpleAuthenticationInfo(principal
\t\t\t, pwd, bs, "myrealm");
\treturn info;
}

准备数据

login.jsp

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

测试

账号错误

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

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

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

密码错误

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

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

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

账号密码正确的情况

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

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

执行的原理过程

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

文字描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

内置过滤器介绍

内置过滤器对应关系

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

内置过滤器说明

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


分享到:


相關文章: