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学习记录(二)的更多相关文章

  1. Material Calendar View 学习记录(二)

    Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...

  2. Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客

    ==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...

  3. JavaScript学习记录二

    title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  4. 2.VUE前端框架学习记录二

    VUE前端框架学习记录二:Vue核心基础2(完结)文字信息没办法描述清楚,主要看编码实战里面,有附带有一个完整可用的Html页面,有需要的同学到脑图里面自取.脑图地址http://naotu.baid ...

  5. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  6. Apcahe Shiro学习笔记(二):通过JDBC进行权限控制

    一.概述: 官方对Realm(领域)的描述:https://www.infoq.com/articles/apache-shiro 其功能本质上是一个安全特定的DAO,用于链接数据持久层(任何形式的都 ...

  7. Apache Shiro 学习记录1

    最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...

  8. Apache Shiro 学习记录5

    本来这篇文章是想写从Factory加载ini配置到生成securityManager的过程的....但是貌似涉及的东西有点多...我学的又比较慢...很多类都来不及研究,我又怕等我后面的研究了前面的都 ...

  9. Apache Shiro 学习记录3

    晚上看了教程的第三章....感觉Shiro字符串权限很好用....但是教程举的例子太少了.....而且有些地方讲的不是很清楚....所以我也自己测试了一下....记录一下测试的结果.... (1) * ...

随机推荐

  1. [USACO14MAR]破坏Sabotage 二分答案

    题目描述 Farmer John's arch-nemesis, Farmer Paul, has decided to sabotage Farmer John's milking equipmen ...

  2. (转)SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开?

    SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开? 原文:http://blog.csdn.net/hhcccchh/article/details/12995539 SELin ...

  3. JVM基础知识2 垃圾收集器与内存分配策略

    如何判断堆中的哪些对象可以被回收 主流的程序语言都是使用根搜索算法(GC Roots Tracing)判定对象是否存活 基本思路是:通过一系列名为“GC Roots”的对象作为起点,从这些节点开始向下 ...

  4. Hive 环境的安装部署

    Hive在客户端上的安装部署 一.客户端准备: 到这我相信大家都已经打过三节点集群了,如果是的话则可以跳过一,直接进入二.如果不是则按流程来一遍! 1.克隆虚拟机,见我的博客:虚拟机克隆及网络配置 2 ...

  5. TypeScript 装饰器

    装饰器(Decorators)可用来装饰类,属性,及方法,甚至是函数的参数,以改变和控制这些对象的表现,获得一些功能. 装饰器以 @expression 形式呈现在被装饰对象的前面或者上方,其中 ex ...

  6. 【Linux】linux下vi命令大全

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  7. Vue.extend动态注册子组件

    写本篇文章之前其实也关注过vue中的一个关于加载动态组件is的API,最开始研究它只是用来实现一个tab切换的功能,使用起来也蛮不错的. is 预期:string | Object (组件的选项对象) ...

  8. flask SQLAlchemy--column 列的类型

    最常用的SQLAlchemy列类型 类型名 Python类型 说 明 Integer int 普通整数,一般是 32 位 SmallInteger int 取值范围小的整数,一般是 16 位 BigI ...

  9. OC 中 self 与 super 总结

    一段代码引发的思考: @implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"% ...

  10. Android Service创建USB HOST通信

    之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...