shiro学习记录(二)
1 在项目中应用shiro框架进行认证
第一步:引入shiro框架相关的jar
<!-- 引入shiro框架的依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.2</version>
</dependency>
第二步:在web.xml中配置spring框架提供的用于整合shiro框架的过滤器(因为是ssh框架,一定要放在structs过滤器前面)
<!-- 配置spring框架提供的用于整合shiro框架的过滤器 -->
<filter>
<filter-name>shrioFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shrioFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
启动tomcat服务器,抛出异常:spring工厂中不存在一个名称为“shiroFilter”的bean对象

第三步:在spring配置文件中配置bean,id为shiroFilter
<!-- 配置shiro框架过滤器工厂对象 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 注入安全管理器對象 -->
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.jsp" />
<property name="successUrl" value="/index.jsp" />
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- 注入url拦截规则-->
<property name="filterChainDefinitions">
<value>
/css/** = anon<!-- 匿名,不登录 -->
/js/** = anon
/image/** = anon
/validatecode.jsp* = anon
/login.jsp = anon
/userAction_login.action = anon
/page_base_staff.action = perms["staff-list"]<!-- perms过滤器,可以判断是否存在逻辑staff-list -->
/* = authc<!-- 过滤器别名,判断当前用户是否认证 -->
</value>
</property>
</bean>
框架提供的过滤器:

第四步:配置安全管理器
<!-- 注册安全管理器对象 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" />
第五步:修改UserAction中的login方法,使用shiro提供的方式进行认证操作
/**
* 用户登录,使用shiro框架认证登录
*/
public String login() {
//从session中获取验证码
String validateCode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
//校验验证码是否输入正确
if (StringUtils.isNotBlank(checkCode) && checkCode.equals(validateCode)) {
//使用shiro框架提供的方法进行认证操作
Subject subject = SecurityUtils.getSubject();//获取当前用户对象,状态为"未认证"
AuthenticationToken token = new UsernamePasswordToken(model.getUserName(),MD5Utils.md5(model.getPassWord()));//创建用户名密码令牌对象
try{
subject.login(token);
} catch(Exception e) {
e.printStackTrace();
return LOGIN;
}
User user = (User) subject.getPrincipal();
ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);
return HOME;
} else {
//输入验证码错误,设置提示信息,跳转到登录页面
this.addActionError("输入验证码错误!");
return LOGIN;
}
}
第六步:自定义realm,并注入给安全管理器
public class BOSRealm extends AuthorizingRealm {
@Autowired
private IUserDao userDao;
//授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
//认证方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("自定义的realm中认证方法执行了。。。。");
UsernamePasswordToken passwordToken = (UsernamePasswordToken) token;
//获取页面输入的用户名
String username = passwordToken.getUsername();
//根据用户名查询数据库中的密码
User user = userDao.findUserByUserName(username);
if (user == null) {
//页面输入用户名不存在
return null;
}
//简单认证信息对象
AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassWord(), this.getName());
//框架负责比对数据库中的密码和页面输入的密码是否一致
return info;
}
}
2.在realm中实现授权
在BOSRealm中实现授权
//授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//为用户授权
info.addStringPermission("staff-list"); //TODO 后期需要修改为登录用户查询数据库,获取实际对应的权限
return info;
}
3.使用shiro的方法注解方式权限控制
第一步: 在spring配置文件中开启shiro注解支持
<!-- 开启shiro注解支持 -->
<bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
<!-- 必须使用cglib方式为action对象创建代理对象 -->
<property name="proxyTargetClass" value="true" />
</bean> <!-- 配置shiro框架提供的切面类,用于创建代理对象 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"></bean>
第二步:在Action的方法上使用shiro注解
@RequiresPermissions("staff-delete")//执行这个方法,需要当前用户具有staff-delete的权限
public String delBatchStaff() {
staffService.delBatchStaff(ids);
return LIST;
}

第三步:在struts.xml中配置全局异常捕获,当shiro框架抛出权限不足异常时,跳转到权限不足提示页面
<!-- 配置全局结果集 -->
<global-results>
<result name="login">/login.jsp</result>
<result name="unauthorized">/unauthorized.jsp</result>
</global-results> <global-exception-mappings>
<exception-mapping result="unauthorized" exception="org.apache.shiro.authz.UnauthorizedException" />
</global-exception-mappings>
4.总结shiro框架提供的权限控制方式
(1) URL拦截权限控制(基于过滤器实现)
<!-- 配置shiro框架过滤器工厂对象 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 注入安全管理器對象 -->
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.jsp" />
<property name="successUrl" value="/index.jsp" />
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- 注入url拦截规则-->
<property name="filterChainDefinitions">
<value>
/css/** = anon<!-- 匿名,不登录 -->
/js/** = anon
/image/** = anon
/validatecode.jsp* = anon
/login.jsp = anon
/userAction_login.action = anon
/page_base_staff.action = perms["staff-list"]<!-- perms过滤器,可以判断是否存在逻辑staff-list -->
/* = authc<!-- 过滤器别名,判断当前用户是否认证 -->
</value>
</property>
</bean>
(2) 方法注解权限控制(基于代理技术实现)
@RequiresPermissions("staff-delete")//执行这个方法,需要当前用户具有staff-delete的权限
public String delBatchStaff() {
staffService.delBatchStaff(ids);
return LIST;
}
(3) 页面标签权限控制(标签技术实现)

(4)代码级别权限控制(基于代理技术实现)

shiro学习记录(二)的更多相关文章
- Material Calendar View 学习记录(二)
Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...
- Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客
==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...
- JavaScript学习记录二
title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- 2.VUE前端框架学习记录二
VUE前端框架学习记录二:Vue核心基础2(完结)文字信息没办法描述清楚,主要看编码实战里面,有附带有一个完整可用的Html页面,有需要的同学到脑图里面自取.脑图地址http://naotu.baid ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- Apcahe Shiro学习笔记(二):通过JDBC进行权限控制
一.概述: 官方对Realm(领域)的描述:https://www.infoq.com/articles/apache-shiro 其功能本质上是一个安全特定的DAO,用于链接数据持久层(任何形式的都 ...
- Apache Shiro 学习记录1
最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...
- Apache Shiro 学习记录5
本来这篇文章是想写从Factory加载ini配置到生成securityManager的过程的....但是貌似涉及的东西有点多...我学的又比较慢...很多类都来不及研究,我又怕等我后面的研究了前面的都 ...
- Apache Shiro 学习记录3
晚上看了教程的第三章....感觉Shiro字符串权限很好用....但是教程举的例子太少了.....而且有些地方讲的不是很清楚....所以我也自己测试了一下....记录一下测试的结果.... (1) * ...
随机推荐
- webpack安装及使用
npm run dev 第一次使用的时候用u盘将某些软件带过去. 所以要找到U盘 2.9.x的版本[推荐] 安装:npm install -g vue-cli 检测版本 vue -V/--versio ...
- poj3254(状压dp入门第一道题,很详细)
题目链接:http://poj.org/problem?id=3254 学习博客:https://blog.csdn.net/harrypoirot/article/details/23163485 ...
- 关于js框架 dwz 与 yii的的分页 以及筛选的结合
此为jicheng1014 原创....地址为http://jicheng1014.cnblogs.com dwz是一个不错的前端框架 但是 注意 所有的后端 都是要自己写的 常见的应用是 ...
- Windows进程通信之一看就懂的匿名管道通信
目录 进程通信之一看就懂的匿名管道通信 一丶匿名管道 1.1何为匿名管道 1.2创建匿名管道需要注意的事项 1.3 创建匿名管道需要的步骤 1.4代码例子 1.5代码运行截图 进程通信之一看就懂的匿名 ...
- GraphQL实战经验和性能问题的解决方案
在现在的公司使用GraphQL有一段时间了. 现公司从创立之后的很长一段时间内是纯PHP的技术栈,前端.后端都在PHP代码中糅合在一起.新功能越加越多,页面越来越复杂之后,那些混在在PHP代码中的HT ...
- 【Linux】linux压缩和解压缩命令大全
tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...
- 屏蔽“您目前使用的Discuz!程序有新版本发布,请及时升级!”提示
在/discuz/source/admincp目录下找到文件:admincp_main.php 找到第49行: if($_G['uid'] && $_G['member']['allo ...
- 使用PM2守护Node.js应用
PM2简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 安装PM2 $ npm install pm2 -g ...
- Java hibernate 遇到的问题:could not read a hi value
问题: 解决办法:在网上看到一篇文章说是把数据库实体类的注解@GeneratedValue改成@GeneratedValue(strategy = GenerationType.IDENTITY) , ...
- UITableViewCellStyle 四种样式
四种样式如下: