第八讲 shiro 整合 ssm
1、整合ssm并且实现用户登录和菜单权限
2、将shiro整合到ssm中
(1)添加shiro相关jar包
(2)在web.xml中添加shiro配置
<!-- 新增shiro配置 -->
<!-- 配置shiroFilter,通过代理来配置,对象由spring容器来创建的,但是交由servlet容器来管理 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<!-- 表示bean的生命周期由servlet管理 -->
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param> <init-param>
<!-- 表示在spring容器中bean的id,如果不配置该属性,那么默认和filter的name一致 -->
<param-name>targetBeanName</param-name>
<param-value>shiroFilter</param-value>
</init-param> </filter> <filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- shiro结束 -->
(3)添加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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.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
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 配置securityManager -->
<property name="securityManager" ref="securityManager"/>
<!-- 当访问需要认证的资源时,如果没有认证,那么将自动跳转到该url;
如果不配置该属性,默认情况下货到根路径下的login.jsp -->
<!-- controller层查看地址配置 -->
<property name="loginUrl" value="/login"></property>
<!-- 配置认证成功后,跳转到那个url上,通常不设置,如果不设置,那么默认认证成功后跳转到上一个url -->
<property name="successUrl" value="/index"></property>
<!-- 配置用户没有权限访问资源时,跳转的页面 /refuse自定义 -->
<property name="unauthorizedUrl" value="/refuse"></property>
<!-- 配置shiro的过滤器链 -->
<property name="filterChainDefinitions">
<value>
<!-- anon表示匿名 -->
/toLogin=anon
/login=authc
/logout=logout
/js/**=anon
/css/**=anon
/images/**=anon
/**=authc
</value>
</property>
</bean> <!-- 配置securityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm"/>
</bean> <bean id="userRealm" class="com.sun123.template.realm.UserRealm"/> </beans>
(4)修改LoginController中的登录方法
package com.sun123.template.conrtroller; import javax.servlet.http.HttpServletRequest; import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
public class LoginController { @RequestMapping(value = {"/","index"})
public ModelAndView index() {
return new ModelAndView("index");
} //去登录页面
@RequestMapping("/toLogin")
public ModelAndView toLogin() {
return new ModelAndView("login");
} //登录
@RequestMapping("/login")
public ModelAndView login(HttpServletRequest request) {
System.out.println("========login=======");
ModelAndView mv = new ModelAndView("login");
String className = (String)request.getAttribute("shiroLoginFailure");
if (UnknownAccountException.class.getName().equals(className)) {
//抛出自定义异常
mv.addObject("msg","用户名或密码错误");
}else if (IncorrectCredentialsException.class.getName().equals(className)) {
//抛出自定义异常
mv.addObject("msg","用户名或密码错误");
} else {
//抛出自定义异常
mv.addObject("msg","系统异常");
} return mv; } //访问被拒绝
@RequestMapping("/refuse")
public ModelAndView refuse() {
return new ModelAndView("refuse");
}
}
(5)添加自定义Realm:UserRealm.java
package com.sun123.template.realm; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; public class UserRealm extends AuthorizingRealm { @Override
public String getName() {
// TODO Auto-generated method stub
return "userRealm";
} //获取认证信息
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("---------认证----------------");
String username = token.getPrincipal().toString();
String pwd = "1111"; return new SimpleAuthenticationInfo(username,pwd,getName());
} //获取授权信息
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { return null;
} }
3、修改UserRealm实现自定义认证
package com.sun123.template.realm; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired; import com.sun123.template.entity.User;
import com.sun123.template.service.UserService; public class UserRealm extends AuthorizingRealm { @Autowired
private UserService userService; @Override
public String getName() {
// TODO Auto-generated method stub
return "userRealm";
} //获取认证信息
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("---------认证----------------");
String username = token.getPrincipal().toString();
User user = userService.findByUserName(username);
return new SimpleAuthenticationInfo(user,user.getPassword(),getName());
} //获取授权信息
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { return null;
} }
4、凭证匹配器配置
<!-- 配置自定义realm -->
<bean id="userRealm" class="com.sun123.template.realm.UserRealm">
<property name="credentialsMatcher" ref="credentialsMatcher" />
</bean>
<!-- 配置凭证匹配器 -->
<bean id="credentialsMatcher"
class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<property name="hashAlgorithmName" value="md5" />
<!-- 迭代次数 -->
<property name="hashIterations" value="2" />
</bean>
UserRealm.java要相应改变
package com.sun123.template.realm; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired; import com.sun123.template.entity.User;
import com.sun123.template.service.UserService; public class UserRealm extends AuthorizingRealm { @Autowired
private UserService userService; @Override
public String getName() {
// TODO Auto-generated method stub
return "userRealm";
} //获取认证信息
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("---------认证----------------");
String username = token.getPrincipal().toString();
User user = userService.findByUserName(username);
return new SimpleAuthenticationInfo(user,user.getPassword(),ByteSource.Util.bytes(user.getPasswordSalt()),getName());
} //获取授权信息
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { return null;
} }
5、logout配置,默认退出后跳转到根路径下,如果需要改变则需重新配置logout过滤器,过滤器的id不能改变,只能为logout
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 配置securityManager -->
<property name="securityManager" ref="securityManager" />
<!-- 当访问需要认证的资源时,如果没有认证,那么将自动跳转到该url; 如果不配置该属性,默认情况下货到根路径下的login.jsp -->
<!-- controller层查看地址配置 -->
<property name="loginUrl" value="/login"></property>
<!-- 配置认证成功后,跳转到那个url上,通常不设置,如果不设置,那么默认认证成功后跳转到上一个url -->
<property name="successUrl" value="/index"></property>
<!-- 配置用户没有权限访问资源时,跳转的页面 /refuse自定义 -->
<property name="unauthorizedUrl" value="/refuse"></property>
<!-- 配置shiro的过滤器链
logout默认退出后跳转到根路径下,可以重新指定
-->
<property name="filterChainDefinitions">
<value>
<!-- anon表示匿名 -->
/toLogin=anon
/login=authc
/logout=logout
/js/**=anon
/css/**=anon
/images/**=anon
/**=authc
</value>
</property>
</bean> <!-- 配置authc过滤器(用户名和密码不使用默认配置username,password) -->
<bean id="authc" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<property name="usernameParam" value="name"/>
<property name="passwordParam" value="pwd"/>
</bean> <!-- 配置logout过滤器 -->
<bean id="logout" class="org.apache.shiro.web.filter.authc.LogoutFilter">
<property name="redirectUrl" value="/toLogin"/>
</bean>
6、改变登录时的表单域名称,需要重新配置authc过滤器
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 配置securityManager -->
<property name="securityManager" ref="securityManager" />
<!-- 当访问需要认证的资源时,如果没有认证,那么将自动跳转到该url; 如果不配置该属性,默认情况下货到根路径下的login.jsp -->
<!-- controller层查看地址配置 -->
<property name="loginUrl" value="/login"></property>
<!-- 配置认证成功后,跳转到那个url上,通常不设置,如果不设置,那么默认认证成功后跳转到上一个url -->
<property name="successUrl" value="/index"></property>
<!-- 配置用户没有权限访问资源时,跳转的页面 /refuse自定义 -->
<property name="unauthorizedUrl" value="/refuse"></property>
<!-- 配置shiro的过滤器链
logout默认退出后跳转到根路径下,可以重新指定
-->
<property name="filterChainDefinitions">
<value>
<!-- anon表示匿名 -->
/toLogin=anon
/login=authc
/logout=logout
/js/**=anon
/css/**=anon
/images/**=anon
/**=authc
</value>
</property>
</bean> <!-- 配置authc过滤器(用户名和密码不使用默认配置username,password) -->
<bean id="authc" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<property name="usernameParam" value="name"/>
<property name="passwordParam" value="pwd"/>
</bean>
登录页面的改变:
<form action="login" method="post">
<!-- username:<input type="text" name="username"><br/>
password:<input type="password" name="password"><br/> -->
username:<input type="text" name="name"><br/>
password:<input type="password" name="pwd"><br/>
<input type="submit" value="login">
</form>
7、授权
(1)修改自定义Realm进行权限检查
(2)在spring-mvc的配置文件中,添加AOP代理,并且添加异常处理
<!-- 开启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的处理方法中,添加权限检测的注解
在jsp页面中,添加按钮权限检测,首先需要导入shiro的标签库
在需要检查权限的地方,使用shiro标签
8、缓存
每次检查权限都会到数据库中获取权限,这样效率很低。可以通过设置缓存来解决该问题。Shiro可以和ehcache或者redis集成。这里使用ehcache来缓存数据。
(1)将ehcache,jar导入系统。
(2)shiro默认集成了一个ehcache的配置文件。也可以自己添加一个进行配置,放入resources下。
ehcache.xml:
<ehcache>
<diskStore path="java.io.tmpdir/shiro-ehcache"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
</ehcache>
(3)在applicationContext-shiro.xml中,添加cacheManager的配置
<!-- 配置securityManager -->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm" />
<property name="cacheManager" ref="cacheManager"></property>
</bean>
<!-- 配置缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"></property>
</bean>
(4)如果在运行过程中,主体的权限发生了改变,那么应该从spring容器中调用realm中的清理缓存方法,进行清理。
UserRealm.java中添加清理缓存方法
//清理缓存方法
protected void clearCache() {
Subject subject = SecurityUtils.getSubject();
super.clearCache(subject.getPrincipals());
}
9、会话管理
<!-- 配置securityManager -->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm" />
<property name="cacheManager" ref="cacheManager"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 配置缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"></property>
</bean> <!-- 配置会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 失效时间单位是毫秒 -->
<property name="globalSessionTimeout" value="300000"/>
<!-- 删除无效session -->
<property name="deleteInvalidSessions" value="true"/>
</bean>
10、记住我
(1)将用户类实现序列化接口,该类的引用类也必须实现序列化接口
(2)设置登录时表单中“记住我”的域名
<!-- 配置authc过滤器(用户名和密码不使用默认配置username,password) -->
<bean id="authc" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<property name="usernameParam" value="name"/>
<property name="passwordParam" value="pwd"/>
<property name="rememberMeParam" value="rememberMe"/>
</bean>
(3)设置“记住我”管理器
<!-- 配置securityManager -->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm" />
<property name="cacheManager" ref="cacheManager"/>
<property name="sessionManager" ref="sessionManager"/>
<property name="rememberMeManager" ref="rememberMeManager"/>
</bean>
<!-- 配置缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"></property>
</bean> <!-- 配置会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 失效时间单位是毫秒 -->
<property name="globalSessionTimeout" value="300000"/>
<!-- 删除无效session -->
<property name="deleteInvalidSessions" value="true"/>
</bean>
<!-- 记住我配置 -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cookie" ref="rememberMeCookie"></property>
</bean>
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!-- 设置cookie存活时间 保存7天 -->
<property name="maxAge" value="604800"/>
<!-- 设置cookie的名称 -->
<property name="name" value="rememberMe"/>
</bean>
<!-- 记住我配置结束 -->
(4)在过滤器链中配置哪些资源通过记住我就可以再次访问
<!-- 配置shiro的过滤器链
logout默认退出后跳转到根路径下,可以重新指定
-->
<property name="filterChainDefinitions">
<value>
<!-- anon表示匿名 -->
/toLogin=anon
/login=authc
/logout=logout
/js/**=anon
/css/**=anon
/images/**=anon
/easyui/**=anon
/index=user
/**=authc
</value>
</property>
(5)jsp页面设置
<form action="login" method="post">
<!-- username:<input type="text" name="username"><br/>
password:<input type="password" name="password"><br/> -->
username:<input type="text" name="name"><br/>
password:<input type="password" name="pwd"><br/>
<input type="checkbox" name="rememberMe">记住我<br/>
<input type="submit" value="login">
</form>
第八讲 shiro 整合 ssm的更多相关文章
- shiro权限控制(一):shiro介绍以及整合SSM框架
shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...
- shiro框架整合ssm框架
下面我通过一个web的maven项目来讲解如何将shiro整合ssm框架,具体结构如下图 一.引入依赖的jar包 <?xml version="1.0" encoding=& ...
- 快速搭建springboot框架以及整合ssm+shiro+安装Rabbitmq和Erlang、Mysql下载与配置
1.快速搭建springboot框架(在idea中): file–>new project–>Spring Initializr–>next–>然后一直下一步. 然后复制一下代 ...
- Shiro 整合SpringMVC 并且实现权限管理
Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...
- Shiro 整合SpringMVC 并且实现权限管理,登录和注销
Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...
- Shiro 整合SpringMVC 并实现权限管理,登录和注销
Shiro 整合SpringMVC 并且实现权限管理,登录和注销 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring S ...
- Spring与Shiro整合 加载权限表达式
Spring与Shiro整合 加载权限表达式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 如何加载权限表达式 我们在上章内容中画了一张图,里面有三个分项,用户 角色 权限: 那 ...
- Spring与Shiro整合 静态注解授权
Spring与Shiro整合 静态注解授权 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 使用Shiro的种类 首先,Shiro的授权方式共有三种: 1.编程式授权(不推荐) 2. ...
- Solr基础知识三(整合SSM)
前两篇讲了solr安装和导入数据,这篇讲如何整合到SSM中. 一.整合SSM 1.1 引入依赖 1.2 初始化solr 1.3 写service 1.4 写控制层 1.5 查询 二.IK分词器 2.1 ...
随机推荐
- 阿里知识储备之二——junit学习以及android单元测试
一,junit框架 http://blog.csdn.net/afeilxc/article/details/6218908 详细见这篇博客 juit目前已经可以和maven项目进行集成和测试,而且貌 ...
- vmware fusion 找不到可以连接的有效对等进程
红框会有什么提示 vmware...,你点击允许
- jQuery file upload callback options
autoUpload By default, files added to the widget are uploaded as soon as the user clicks on the star ...
- Mybaits解决实体类字段与数据库字段不一致问题
public class Employee { private Integer id; private String lastName; private String email; private S ...
- 自动化运维--ansible(1)
前戏 ansible 批量在远程主机上执行命令 openpyxl 操作excel表格 puppet ansible slatstack ansible epel源 第一步: 下载epel源 wget ...
- Jmeter之内存溢出解决办法
使用Jmeter进行压力测试会遇到一段时间后报内存溢出的错误,导致Jmeter卡死.这是因为Jmeter默认的HEAP配置的太小了,解决办法如下: 1.Windows环境 修改jmeter.bat ...
- excel 导入导出测试点
目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...
- <class 'blog.admin.CategoryAdmin'>: (admin.E108) The value of 'list_display[0]' refers to 'mame', which is not a callable, an attribute of 'CategoryAdmin', or an attribute or method on 'blog.Category'
系统反馈此类错误是因为行列映射时无法对应: 引起无法对应的原因有: 定义是缺少某列,定义时缩进导致,映射关系时缺少某列,(通俗讲列名对应不上). 这种错误多是python中的 因为其中对于空格的要求是 ...
- Jmeter 03 Jmeter断言之Json断言
json断言可以让我们很快的定位到响应数据中的某一字段,当然前提是响应数据是json格式的,所以如果响应数据为json格式的话,使用json断言还是相当方便的. 还是以之前的接口举例 Url: htt ...
- 文件压缩、解压工具类。文件压缩格式为zip
package com.JUtils.file; import java.io.BufferedOutputStream; import java.io.File; import java.io.Fi ...