当前位置: 首页 > news >正文

shiro

一、概述

官网介绍,Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.

二、案例

在创建的项目中导入shiro的jar包。

配置web.xml

  <!-- 配置spring框架提供的用于整合shiro框架的过滤器 -->

  <filter>

       <filter-name>shiroFilter</filter-name>

       <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

  </filter>

  <filter-mapping>

       <filter-name>shiroFilter</filter-name>

       <url-pattern>/*</url-pattern>

  </filter-mapping>

在applicationContext.xml中配置shiroFilter的bean,并开启注解和创建代理对象

         <!-- 配置shiro框架的过滤器工厂对象 -->

         <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

                   <!-- 注入安全管理器对象 -->

                   <property name="securityManager" ref="securityManager"/>

                   <!-- 注入相关页面访问URL -->

                   <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

                                     /images/** = anon

                                     /validatecode.jsp* = anon

                                     /login.jsp = anon

                                     /userAction_login.action = anon

                                     /page_base_staff.action = perms["staff-list"]

                                     /* = authc

                            </value>

                   </property>

         </bean>

        

         <!-- 注册安全管理器对象 -->

         <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

                   <property name="realm" ref="bosRealm"/>

         </bean>

        

         <!-- 注册realm -->

         <bean id="bosRealm" class="com.xingji.bos.realm.BOSRealm"></bean>

        

         <!-- 开启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"/>

编写安全管理器类BOSRealm,编写认证和授权的方法

public class BOSRealm extends AuthorizingRealm {



         @Autowired

         private IUserDao userDao;



         @Override

         protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

                   // TODO Auto-generated method stub

                   SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

                   info.addStringPermission("staff-list");

                   return info;

         }



         @Override

         protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

                   // TODO Auto-generated method stub

                   System.out.println("自定义的realm中的认证方法");

                   UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;

                   String username = usernamePasswordToken.getUsername();

                   User user = userDao.findUserByUsername(username);

                   if (user == null) {

                            return null;

                   }

                   AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());

                   return info;

         }



}

编写登录认证中userAction中的login方法  

       public String login() {

                   // 从session中获取正确的验证码

                   String validatecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");

                   // 校验验证码是否正确

                   if (StringUtils.isNotBlank(checkcode) && validatecode.equals(checkcode)) {

                            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;

                   }

         }

使用注解给特定的方法授权

         @RequiresPermissions("staff-delete")

         public String deleteBatch() {

                   staffService.deleteBatch(ids);

                   return LIST;

         }

三、使用shiro提供的页面标签实现权限控制

在jsp中引入shiro的标签库

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

在需要使用的地方使用

         <shiro:hasPermission name="staff-delete">

         {

                   id : 'button-delete',

                   text : '作废',

                   iconCls : 'icon-cancel',

                   handler : doDelete

         },

         </shiro:hasPermission>

 

相关文章:

  • ehcache
  • highcharts
  • spring框架和jdk的版本兼容
  • 系统中日志的作用
  • 针对tomcat入侵的简单防御
  • 诡异的MalformedParameterizedTypeException异常
  • struts2中使用ajax的问题
  • LeetCode(9)判断回文数
  • LeetCode(14)获取字符串数组中字符串的公共前缀
  • LintCode(632)查找二叉树中值最大的节点
  • LeetCode(20)判断字符串合法括号
  • spring整合jbpm的简述
  • nginx反向代理tomcat一段时间后出现的ERR_CONTENT_LENGTH_MISMATCH异常
  • cas简介
  • [one_demo_15]模拟交通灯管理系统
  • 【mysql】环境安装、服务启动、密码设置
  • 【RocksDB】TransactionDB源码分析
  • Bootstrap JS插件Alert源码分析
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES6之路之模块详解
  • Git 使用集
  • Mysql5.6主从复制
  • React 快速上手 - 07 前端路由 react-router
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue.js-Day01
  • win10下安装mysql5.7
  • 计算机常识 - 收藏集 - 掘金
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 容器服务kubernetes弹性伸缩高级用法
  • 首页查询功能的一次实现过程
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #《AI中文版》V3 第 1 章 概述
  • #QT(串口助手-界面)
  • (09)Hive——CTE 公共表达式
  • (C++17) optional的使用
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • ****Linux下Mysql的安装和配置
  • .Mobi域名介绍
  • .Net core 6.0 升8.0
  • .NET CORE Aws S3 使用
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 中viewstate的原理和使用
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net6 webapi log4net完整配置使用流程
  • .net知识和学习方法系列(二十一)CLR-枚举
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [].slice.call()将类数组转化为真正的数组
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [CISCN2019 华东南赛区]Web11
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [FC][常见Mapper IRQ研究]
  • [hdu2196]Computer树的直径