第八讲 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 ...
随机推荐
- 源码阅读-SwiftyJSON
最后更新:2018-03-19 一.说在前面的话: SwiftyJSON 作为一个 swift 的解析库, 在 Swift4 之前备受欢迎, 目前(2018.3.19) 已经有 1.6w+ Star ...
- 安装mariadb报错: Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
卸载和删除都使用过了,没有起到效果,然后用了如下的方案,进行解决: CentOS 从 Yum 源安装配置 Mariadb 2017.03.01 WangYan 学习笔记 热度 7℃ 一.安装 Mar ...
- Vue v-if以及 v-else 的使用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 使用注解装配Bean
注解@Component代表Spring Ioc 会把 这个类扫描生产Bean 实例,而其中 value属性代表这个类在Spring 中的id,这就相当于XML方式定义的Bean 的 id 现在有了 ...
- 查看磁盘IO负载 - 看哪些进程在读写磁盘
原文:http://www.cnblogs.com/cloudstorage/archive/2012/11/11/2764623.html 今天晚上发现服务器io有点高,顺带看看哪些进程在读写磁盘. ...
- STL标准库-容器-set与map
STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...
- 3、maven导入外部自定义jar包
有些时候我们自己有一些jar包需要导入到我们的仓库中,然后在maven项目里的pom.xml文件加入这些jar包的依赖即可使用这些jar包了 1.确保行执行mvn -v没有问题 2.把需要引入的jar ...
- Delphi XE2 之 FireMonkey 入门(32) - 数据绑定: TBindingsList: TBindList、TBindPosition [未完成...]
Delphi XE2 之 FireMonkey 入门(32) - 数据绑定: TBindingsList: TBindList.TBindPosition [未完成...] //待补...
- 八:flask-重定向示例
现象:访问地址a,跳转到地址b,在flask中,使用redirect()来进行重定向 永久性重定向:301,多用于旧网址被废弃了,需要跳转到新网址访问 例如请求www.jingdong.com,会自动 ...
- C#SQL小结
对于c#获取Sql数据目前我采用的是 System.Data.SqlClient.SqlDataReader类. 主要用到如下API: SqlDataReader.Read():每次获取一行的数据,直 ...