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的更多相关文章

  1. shiro权限控制(一):shiro介绍以及整合SSM框架

    shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...

  2. shiro框架整合ssm框架

    下面我通过一个web的maven项目来讲解如何将shiro整合ssm框架,具体结构如下图 一.引入依赖的jar包 <?xml version="1.0" encoding=& ...

  3. 快速搭建springboot框架以及整合ssm+shiro+安装Rabbitmq和Erlang、Mysql下载与配置

    1.快速搭建springboot框架(在idea中): file–>new project–>Spring Initializr–>next–>然后一直下一步. 然后复制一下代 ...

  4. Shiro 整合SpringMVC 并且实现权限管理

    Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...

  5. Shiro 整合SpringMVC 并且实现权限管理,登录和注销

    Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...

  6. Shiro 整合SpringMVC 并实现权限管理,登录和注销

    Shiro 整合SpringMVC 并且实现权限管理,登录和注销 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring S ...

  7. Spring与Shiro整合 加载权限表达式

    Spring与Shiro整合 加载权限表达式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 如何加载权限表达式  我们在上章内容中画了一张图,里面有三个分项,用户 角色 权限: 那 ...

  8. Spring与Shiro整合 静态注解授权

    Spring与Shiro整合 静态注解授权 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 使用Shiro的种类 首先,Shiro的授权方式共有三种: 1.编程式授权(不推荐) 2. ...

  9. Solr基础知识三(整合SSM)

    前两篇讲了solr安装和导入数据,这篇讲如何整合到SSM中. 一.整合SSM 1.1 引入依赖 1.2 初始化solr 1.3 写service 1.4 写控制层 1.5 查询 二.IK分词器 2.1 ...

随机推荐

  1. MySort的实现

    代码: package week12; import java.util.*; import java.lang.Integer; public class MySort{ public static ...

  2. java8 stream初试,map排序,list去重,统计重复元素个数,获取map的key集合和value集合

    //定义一个100元素的集合,包含A-Z List<String> list = new LinkedList<>(); for (int i =0;i<100;i++) ...

  3. 旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)

    题目地址 : 旋转数组. 网上好多不是根本就是错的,就是空间复杂度不是真正为1 下面总结一下 方法1 普通方法(空间复杂度不满足要求,但是题目并不会判错,说明他们没用对空间进行校验) ··· publ ...

  4. 各种sort排序总结

    冒泡排序 选择排序 插入排序

  5. preventDefault 和 stopPropagation

    概述 以前开发项目的时候,总是分不清楚 preventDefault 和 stopPropagation,每次都是用 @click.stop试一下,不能就用@click.prevent试一下.今天来好 ...

  6. Mongodb-安全配置优化

    1.MongoDB配置文件样例 # mongod.conf, Percona Server for MongoDB # for documentation of all options, see: # ...

  7. Field baseMapper in com.baomidou.mybatisplus.extension.service.impl.ServiceImpl required a single bean, but xx were found:

    在学习使用 mybatis-plus 时,遇到一个奇怪的异常 如 代码一: 代码一: Error starting ApplicationContext. To display the conditi ...

  8. MySQL的事务和视图

    事务 1.概念 一条或者多条sql语句的集合! 事务:就是一堆操作的集合,他们同生共死.要么都执行成功,要么都执行失败2.事务的特性  ACID  A:原子性  完整的,不可分割的 原子性 (Atom ...

  9. 安装Linux系统CentOS6.5

    个人机器搭建分布式环境时避免要使用虚拟机来满足分布式环境所需的机器,当然伪分布式除外. 简单记录下虚拟机环境的创建过程,Mac上常用的虚拟机VMware Fusion. 虚拟机资源库中新建虚拟机: 选 ...

  10. 【7.10校内test】T3经营与开发

    [题目链接luogu] 它……又是个DP 我……我讨厌DP!? 然后又是读入,显然用快读啊:(数据范围还是很大的)(习惯) 然后我们发现,不论是损耗值维修值,还是采矿所得,维修花费,都带着个p,因此我 ...