上一篇文章已经对shiro框架做了一定的介绍,这篇文章讲述使用spring整合shiro框架,实现用户认证已经权限控制

1.搭建环境

这里不在赘述spring环境的搭建,可以简单的搭建一个ssm框架,整合后进行简单的测试

1.1 添加依赖

<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--shiro核心包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>

1.2 web.xml配置

在web.xml中添加如下过滤器,注意filter-name的值是shiroFilter

<!-- Shiro Security filter filter-name这个名字的值将来还会在spring中用到-->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这个过滤器拦截所有的请求,根据filter-name也就是shiroFilter转发到shiro的配置文件中的一个名字也为shiroFilter的ShiroFilterFactoryBean,在下面的配置文件中有体现

1.3 Spring整合shiro

在export_manager_web的resources下的spring文件夹创建配置文件applicationContext-shiro.xml

这是我的项目下的配置,这个配置文件应该在resources下,在项目启动是被加载

<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- filter-name这个名字的值来自于web.xml中filter的名字 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!--登录页面 如果没有登录 访问项目的方法或页面 直接跳转到这个页面 -->
<property name="loginUrl" value="/login.jsp"></property>
<!--登录后 在访问没有经过授权的方法或页面时 直接跳转到这个页面 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp"></property>
<property name="filterChainDefinitions">
<!-- /**代表下面的多级目录也过滤 -->
<value>
/login.jsp = anon
/css/** = anon
/img/** = anon
/plugins/** = anon
/make/** = anon
/login.do = anon
/** = authc
</value>
</property>
</bean> <!-- 引用自定义的realm -->
<bean id="saasRealm" class="cn.test.realm.SaasRealm"/> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="saasRealm"/>
</bean>
<!-- 安全管理器 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean> <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- 生成代理,通过代理进行控制 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true"/>
</bean> <aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>

2.完成shiro认证操作

2.1 在LoginController编写login登录方法

@RequestMapping("/login")
public String login(String email, String password) {
// 做非空判断
if(StringUtils.isEmpty(email)||StringUtils.isEmpty(password)){
request.setAttribute("error","邮箱或密码不能为空");
return "forward:login.jsp";
}
// 使用shiro的认证方式:1、创建令牌 2、获取主题 3、开始认证
// Md5Hash也是shiro框架提供的加密方式
password = new Md5Hash(password, email, 2).toString();//把页面上输入的明文的密码转成密文的
UsernamePasswordToken token = new UsernamePasswordToken(email,password);//创建令牌
Subject subject = SecurityUtils.getSubject();//获取主题
try {
//开始认证,会进入用户自定义的realm中的认证方法完成认证,认证失败会抛出异常
subject.login(token);
} catch (AuthenticationException e) {
// e.printStackTrace();
request.setAttribute("error","邮箱或者密码有误");
return "forward:login.jsp";
}
User user = (User) subject.getPrincipal(); //从shiro中获取当前登录人
// 把当前登录人放入到session
session.setAttribute("loginUser",user);
// 下面是对权限的管理
List<Module> moduleList = moduleService.findModuleListByUser(user);
session.setAttribute("modules",moduleList);
return "home/main";
}

2.2 自定义realm

创建一个类继承一个父类AuthorizingRealm,实现父类的两个方法,一个关于认证,一个关于授权的,这个类就是自定义的realm,下面是我自定义realm的内容

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List; public class SaasRealm extends AuthorizingRealm { @Autowired
private UserService userService; // 认证 ,在方法中完成email和password的校验
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("+++++进入了认证方法AuthenticationInfo");
// 通过参数获取用户输入的用户名和密码
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String email = token.getUsername();
String password_page = new String(token.getPassword());
User user = userService.findByEmail(email); //从数据库中查询
if(user!=null){
// 匹配密码
String password_db = user.getPassword();
if(password_db.equals(password_page)){
//Object principal, Object credentials 密码, String realmName 当前realm的类名
return new SimpleAuthenticationInfo(user,password_db,getName());
}
}
return null; //没有用户
} // 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
} }

定义过realm之后将Realm交给IOC容器并且受securityManager的管理

<!-- 引用自定义的realm-->
<bean id="saasRealm" class="com.itheima.controller.realm.SaasRealm"/> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="saasRealm"/>
<!--将缓存对象添加到管理者的属性中-->
<property name="cacheManager" ref="cacheManager"/>
</bean>

2.3 退出登录

在LoginController中的写logout方法

@RequestMapping(value="/logout",name="用户登出")
public String logout(){
SecurityUtils.getSubject().logout();//登出
return "forward:login.jsp";
}

到这里,使用shior框架完成用户的认证已经完成,下面来实现使用shiro框架进行授权管理

3.基于shiro的用户授权

控制权限主要有两种方式,xml配置和注解

3.1.xml配置

3.2注解配置

最后:

1.可以使用shiro的标签库实现细颗粒度的控制,使用的时候可以参考我上一篇文章中介绍的每一个标签的作用来实现,记得引入标签库

2.如果shiro自带的十个过滤器不能满足你的需求,你可以自定义过滤器,实现自己的功能

spring整合shiro框架的更多相关文章

  1. spring 整合 shiro框架

    shiro是用来干嘛的?从它的官网上(http://shiro.apache.org/)基本可以了解到,她主要提供以下功能: (1)Authentication(认证) (2)Authorizatio ...

  2. spring 整合shiro框架 模拟登录控制器。

    一.导入shiro  jar包.  我在maven项目中,将常用的jar包都放在里面. <?xml version="1.0" encoding="UTF-8&qu ...

  3. Spring整合Shiro并扩展使用EL表达式

    Shiro是一个轻量级的权限控制框架,应用非常广泛.本文的重点是介绍Spring整合Shiro,并通过扩展使用Spring的EL表达式,使@RequiresRoles等支持动态的参数.对Shiro的介 ...

  4. 【Spring】Spring系列7之Spring整合MVC框架

    7.Spring整合MVC框架 7.1.web环境中使用Spring 7.2.整合MVC框架 目标:使用Spring管理MVC的Action.Controller 最佳实践参考:http://www. ...

  5. Spring整合Shiro做权限控制模块详细案例分析

    1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...

  6. 【SSH框架】系列之 Spring 整合 Hibernate 框架

    1.SSH 三大框架整合原理 Spring 与 Struts2 的整合就是将 Action 对象交给 Spring 容器来负责创建. Spring 与 Hibernate 的整合就是将 Session ...

  7. Spring整合EHCache框架

    在Spring中使用缓存可以有效地避免不断地获取相同数据,重复地访问数据库,导致程序性能恶化. 在Spring中已经定义了缓存的CacheManager和Cache接口,只需要实例化便可使用. Spr ...

  8. Spring整合Struts2框架的第二种方式(Action由Spring框架来创建)(推荐大家来使用的)

    1. spring整合struts的基本操作见我的博文:https://www.cnblogs.com/wyhluckdog/p/10140588.html,这里面将spring与struts2框架整 ...

  9. Spring整合Struts2框架的第一种方式(Action由Struts2框架来创建)。在我的上一篇博文中介绍的通过web工厂的方式获取servcie的方法因为太麻烦,所以开发的时候不会使用。

    1. spring整合struts的基本操作见我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10140588.html,这里面将spring与struts2 ...

随机推荐

  1. FTPClient登录慢的问题

    java上传文件到ftp上,发现特别慢,debug了一下发现链接正常,ftp.login(username, password)这个登录方法特别慢 解决方案: vi /etc/vsftpd/vsftp ...

  2. 【线段树】[Luogu P4198]楼房修建

    显然要维护斜率区间单调递增 并且第一个必选,后一个比前一个选中的斜率大的必选 考虑如何合并两个区间 我们维护一个least值,least这个值必选,且之后选的都必须严格大于least,Push_Up的 ...

  3. log4cplus TimeBasedRollingFileAppender

    参考自:http://blog.csdn.net/u010607621/article/details/54944696 对于TimeBasedRollingFileAppender 这个日志appe ...

  4. lterator遍历

    iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制 作用: 1.为各种数据结构,提供一个统一的.简便的访问接口: 2.使得数据结构的成员能够按某种次序排列 3.ES6创造了一种新的 ...

  5. 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。

    在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...

  6. 14. static(静态) 关键字

    1.修饰成员变量 1)定义:数据需要被共享给所有对象使用使用static修饰(全局变量) 2)注意: 1.用static中创建的成员变量在内存中只有一份 2.千万不要为了方便访问数据而使用static ...

  7. 云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态

    摘要: 2018年12月20日,云栖社区3岁.阿里巴巴常说“晴天修屋顶”,所以我们特别制作了这个专辑——分享给开发者们20个阿里故事,50本书籍. 2015年12月20日,云栖社区上线.2018年12 ...

  8. python解决迅雷下载限制的方法

    一.转换迅雷下载链接 import base64 url='thunder://QUFodHRwOi8veHVubGVpLnhpYXphaS16dWlkYS5jb20vMTkwOC/JqLa+Mi5I ...

  9. NX二次开发-UFUN参数选择对话框UF_UI_select_parameters

    #include <uf.h> #include <uf_ui.h> #include <uf_modl.h> UF_initialize(); //参数选择对话框 ...

  10. NX二次开发-测量投影距离

    NXOPEN方法,直接录制测量投影距离命令 NX9+VS2012 #include <NXOpen/Annotations.hxx> #include <NXOpen/Assembl ...