Shiro采用shiro实现登录认证与权限授权管理

2023-10-31

Shiro 是一个 Apache 下的一开源项目项目,旨在简化身份验证和授权。

 

spring,springMVC,maven,shiro

 

shiro的配置,通过maven加入shiro相关jar包

 

1.shiro的配置,通过maven加入shiro相关jar包

 

复制代码

 1     <!-- shiro -->  
 2         <dependency>  
 3             <groupId>org.apache.shiro</groupId>  
 4             <artifactId>shiro-core</artifactId>  
 5             <version>1.2.1</version>  
 6         </dependency>  
 7         <dependency>  
 8             <groupId>org.apache.shiro</groupId>  
 9             <artifactId>shiro-web</artifactId>  
10             <version>1.2.1</version>  
11         </dependency>  
12         <dependency>  
13             <groupId>org.apache.shiro</groupId>  
14             <artifactId>shiro-ehcache</artifactId>  
15             <version>1.2.1</version>  
16         </dependency>  
17         <dependency>  
18             <groupId>org.apache.shiro</groupId>  
19             <artifactId>shiro-spring</artifactId>  
20             <version>1.2.1</version>  
21         </dependency>  

复制代码

 

 

2.2 在web.xml中添加shiro过滤器

复制代码

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
 4     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
 6     id="WebApp_ID" version="2.4">
 7 
 8     <!-- 配置spring容器监听器 -->
 9 <span style="color:#ff6666;">    <context-param>
10         <param-name>contextConfigLocation</param-name>
11         <param-value>classpath:application-context-*.xml</param-value>
12     </context-param>
13     <listener>
14         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
15     </listener></span>
16     <!-- post乱码处理 -->
17     <filter>
18         <filter-name>CharacterEncodingFilter</filter-name>
19         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
20         <init-param>
21             <param-name>encoding</param-name>
22             <param-value>utf-8</param-value>
23         </init-param>
24     </filter>
25     <filter-mapping>
26         <filter-name>CharacterEncodingFilter</filter-name>
27         <url-pattern>/*</url-pattern>
28     </filter-mapping>
29     <!-- 配置shiro的核心拦截器 -->
30 <span style="white-space:pre">    </span><filter>
31         <filter-name>shiroFilter</filter-name>
32         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
33     </filter>
34     <filter-mapping>
35         <filter-name>shiroFilter</filter-name>
36         <url-pattern>/admin/*</url-pattern>
37     </filter-mapping>
38     <!-- 配置后台Springmvc 它拦截.do结尾的请求 -->
39     <servlet>
40         <servlet-name>back</servlet-name>
41         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
42         <init-param>
43             <param-name>contextConfigLocation</param-name>
44             <param-value>classpath:springmvc.xml</param-value>
45         </init-param>
46     </servlet>
47     <servlet-mapping>
48         <servlet-name>back</servlet-name>
49         <url-pattern>*.do</url-pattern>
50     </servlet-mapping>
51     <display-name>Archetype Created Web Application</display-name>
52 </web-app>

复制代码

 

3 spring中对shiro配置

复制代码

  1 <beans xmlns="http://www.springframework.org/schema/beans"
  2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  3     xmlns:context="http://www.springframework.org/schema/context"
  4     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
  6         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
  7         http://www.springframework.org/schema/mvc 
  8         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
  9         http://www.springframework.org/schema/context 
 10         http://www.springframework.org/schema/context/spring-context-3.2.xsd 
 11         http://www.springframework.org/schema/aop 
 12         http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
 13         http://www.springframework.org/schema/tx 
 14         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
 15 
 16     <!-- web.xml中shiro的filter对应的bean -->
 17     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
 18         <!-- 管理器,必须设置 -->
 19         <property name="securityManager" ref="securityManager" />
 20         <!-- 拦截到,跳转到的地址,通过此地址去认证 -->
 21         <property name="loginUrl" value="/admin/login.do" />
 22         <!-- 认证成功统一跳转到/admin/index.do,建议不配置,shiro认证成功自动到上一个请求路径 -->
 23         <property name="successUrl" value="/admin/index.do" />
 24         <!-- 通过unauthorizedUrl指定没有权限操作时跳转页面 -->
 25         <property name="unauthorizedUrl" value="/refuse.jsp" />
 26         <!-- 自定义filter,可用来更改默认的表单名称配置 -->
 27         <property name="filters">
 28             <map>
 29                 <!-- 将自定义 的FormAuthenticationFilter注入shiroFilter中 -->
 30                 <entry key="authc" value-ref="formAuthenticationFilter" />
 31             </map>
 32         </property>
 33         <property name="filterChainDefinitions">
 34             <value>
 35                 <!-- 对静态资源设置匿名访问 -->
 36                 /images/** = anon
 37                 /js/** = anon
 38                 /styles/** = anon
 39                 <!-- 验证码,可匿名访问 -->
 40                 /validatecode.jsp = anon
 41                 <!-- 请求 logout.do地址,shiro去清除session -->
 42                 /admin/logout.do = logout
 43                 <!--商品查询需要商品查询权限 ,取消url拦截配置,使用注解授权方式 -->
 44                 <!-- /items/queryItems.action = perms[item:query] /items/editItems.action 
 45                     = perms[item:edit] -->
 46                 <!-- 配置记住我或认证通过可以访问的地址 -->
 47                 /welcome.jsp = user
 48                 /admin/index.do = user
 49                 <!-- /** = authc 所有url都必须认证通过才可以访问 -->
 50                 /** = authc
 51             </value>
 52         </property>
 53     </bean>
 54 
 55     <!-- securityManager安全管理器 -->
 56     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
 57         <property name="realm" ref="customRealm" />
 58         <!-- 注入缓存管理器 -->
 59         <property name="cacheManager" ref="cacheManager" />
 60         <!-- 注入session管理器 -->
 61         <!-- <property name="sessionManager" ref="sessionManager" /> -->
 62         <!-- 记住我 -->
 63         <property name="rememberMeManager" ref="rememberMeManager" />
 64     </bean>
 65 
 66     <!-- 自定义realm -->
 67     <bean id="customRealm" class="com.zhijianj.stucheck.shiro.CustomRealm">
 68         <!-- 将凭证匹配器设置到realm中,realm按照凭证匹配器的要求进行散列 -->
 69         <!-- <property name="credentialsMatcher" ref="credentialsMatcher" /> -->
 70     </bean>
 71 
 72     <!-- 凭证匹配器 -->
 73     <bean id="credentialsMatcher"
 74         class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
 75         <!-- 选用MD5散列算法 -->
 76         <property name="hashAlgorithmName" value="md5" />
 77         <!-- 进行一次加密 -->
 78         <property name="hashIterations" value="1" />
 79     </bean>
 80 
 81     <!-- 自定义form认证过虑器 -->
 82     <!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->
 83     <!-- 可通过此配置,判断验证码 -->
 84     <bean id="formAuthenticationFilter"
 85         class="com.zhijianj.stucheck.shiro.CustomFormAuthenticationFilter ">
 86         <!-- 表单中账号的input名称,默认为username -->
 87         <property name="usernameParam" value="username" />
 88         <!-- 表单中密码的input名称,默认为password -->
 89         <property name="passwordParam" value="password" />
 90         <!-- 记住我input的名称,默认为rememberMe -->
 91         <property name="rememberMeParam" value="rememberMe" />
 92     </bean>
 93     <!-- 会话管理器 -->
 94     <bean id="sessionManager"
 95         class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
 96         <!-- session的失效时长,单位毫秒 -->
 97         <property name="globalSessionTimeout" value="600000" />
 98         <!-- 删除失效的session -->
 99         <property name="deleteInvalidSessions" value="true" />
100     </bean>
101     <!-- 缓存管理器 -->
102     <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
103         <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml" />
104     </bean>
105     <!-- rememberMeManager管理器,写cookie,取出cookie生成用户信息 -->
106     <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
107         <property name="cookie" ref="rememberMeCookie" />
108     </bean>
109     <!-- 记住我cookie -->
110     <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
111         <!-- rememberMe是cookie的名字 -->
112         <constructor-arg value="rememberMe" />
113         <!-- 记住我cookie生效时间30天 -->
114         <property name="maxAge" value="2592000" />
115     </bean>
116 </beans>

复制代码

 

在上面的配置中每次开启了sessionManager都会出问题在这里将它注释掉了。

其次,上面中的配置也是将credentialsMatcher没有加入了,这种方式适用于没有对密码进行处理的情况。

其中CustomRealm的配置是重点。

 

4 自定义Realm编码

CustomRealm如下:

复制代码

 1 public class CustomRealm extends AuthorizingRealm {
 2     // 设置realm的名称
 3     @Override
 4     public void setName(String name) {
 5         super.setName("customRealm");
 6     }
 7 
 8     @Autowired
 9     private AdminUserService adminUserService;
10 
11     /**
12      * 认证
13      */
14     @Override
15     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
16 
17         // token中包含用户输入的用户名和密码
18         // 第一步从token中取出用户名
19         String userName = (String) token.getPrincipal();
20         // 第二步:根据用户输入的userCode从数据库查询
21         TAdminUser adminUser = adminUserService.getAdminUserByUserName(userName);
22         // 如果查询不到返回null
23         if (adminUser == null) {//
24             return null;
25         }
26         // 获取数据库中的密码
27         String password = adminUser.getPassword();
28         /**
29          * 认证的用户,正确的密码
30          */
31         AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(adminUser, password, this.getName());
32                //MD5 加密+加盐+多次加密
33 //<span style="color:#ff0000;">SimpleAuthenticationInfo authcInfo = new SimpleAuthenticationInfo(adminUser, password,ByteSource.Util.bytes(salt), this.getName());</span>
34         return authcInfo;
35     }
36 
37     /**
38      * 授权,只有成功通过<span style="font-family: Arial, Helvetica, sans-serif;">doGetAuthenticationInfo方法的认证后才会执行。</span>
39      */
40     @Override
41     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
42         // 从 principals获取主身份信息
43         // 将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),
44         TAdminUser activeUser = (TAdminUser) principals.getPrimaryPrincipal();
45         // 根据身份信息获取权限信息
46         // 从数据库获取到权限数据
47         TAdminRole adminRoles = adminUserService.getAdminRoles(activeUser);
48         // 单独定一个集合对象
49         List<String> permissions = new ArrayList<String>();
50         if (adminRoles != null) {
51             permissions.add(adminRoles.getRoleKey());
52         }
53         // 查到权限数据,返回授权信息(要包括 上边的permissions)
54         SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
55         // 将上边查询到授权信息填充到simpleAuthorizationInfo对象中
56         simpleAuthorizationInfo.addStringPermissions(permissions);
57         return simpleAuthorizationInfo;
58     }
59 
60     // 清除缓存
61     public void clearCached() {
62         PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();
63         super.clearCache(principals);
64     }
65 }

复制代码

 

5 缓存配置

ehcache.xml代码如下:

复制代码

 1 <ehcache updateCheck="false" name="shiroCache">
 2     <defaultCache
 3             maxElementsInMemory="10000"
 4             eternal="false"
 5             timeToIdleSeconds="120"
 6             timeToLiveSeconds="120"
 7             overflowToDisk="false"
 8             diskPersistent="false"
 9             diskExpiryThreadIntervalSeconds="120"
10             />
11 </ehcache>

复制代码

 

通过使用ehache中就避免第次都向服务器发送权限授权(doGetAuthorizationInfo)的请求。

6.自定义表单编码过滤器

CustomFormAuthenticationFilter代码,认证之前调用,可用于验证码校验

 

复制代码

 1 public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {
 2     // 原FormAuthenticationFilter的认证方法
 3     @Override
 4     protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
 5         // 在这里进行验证码的校验
 6 
 7         // 从session获取正确验证码
 8         HttpServletRequest httpServletRequest = (HttpServletRequest) request;
 9         HttpSession session = httpServletRequest.getSession();
10         // 取出session的验证码(正确的验证码)
11         String validateCode = (String) session.getAttribute("validateCode");
12 
13         // 取出页面的验证码
14         // 输入的验证和session中的验证进行对比
15         String randomcode = httpServletRequest.getParameter("randomcode");
16         if (randomcode != null && validateCode != null && !randomcode.equals(validateCode)) {
17             // 如果校验失败,将验证码错误失败信息,通过shiroLoginFailure设置到request中
18             httpServletRequest.setAttribute("shiroLoginFailure", "randomCodeError");
19             // 拒绝访问,不再校验账号和密码
20             return true;
21         }
22         return super.onAccessDenied(request, response);
23     }
24 }

复制代码

 

在此符上验证码jsp界面的代码

validatecode.jsp

复制代码

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ page import="java.util.Random"%>
 4 <%@ page import="java.io.OutputStream"%>
 5 <%@ page import="java.awt.Color"%>
 6 <%@ page import="java.awt.Font"%>
 7 <%@ page import="java.awt.Graphics"%>
 8 <%@ page import="java.awt.image.BufferedImage"%>
 9 <%@ page import="javax.imageio.ImageIO"%>
10 <%
11     int width = 60;
12     int height = 32;
13     //create the image
14     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
15     Graphics g = image.getGraphics();
16     // set the background color
17     g.setColor(new Color(0xDCDCDC));
18     g.fillRect(0, 0, width, height);
19     // draw the border
20     g.setColor(Color.black);
21     g.drawRect(0, 0, width - 1, height - 1);
22     // create a random instance to generate the codes
23     Random rdm = new Random();
24     String hash1 = Integer.toHexString(rdm.nextInt());
25     // make some confusion
26     for (int i = 0; i < 50; i++) {
27         int x = rdm.nextInt(width);
28         int y = rdm.nextInt(height);
29         g.drawOval(x, y, 0, 0);
30     }
31     // generate a random code
32     String capstr = hash1.substring(0, 4);
33     //将生成的验证码存入session
34     session.setAttribute("validateCode", capstr);
35     g.setColor(new Color(0, 100, 0));
36     g.setFont(new Font("Candara", Font.BOLD, 24));
37     g.drawString(capstr, 8, 24);
38     g.dispose();
39     //输出图片
40     response.setContentType("image/jpeg");
41     out.clear();
42     out = pageContext.pushBody();
43     OutputStream strm = response.getOutputStream();
44     ImageIO.write(image, "jpeg", strm);
45     strm.close();
46 %>

复制代码

 

7.登录控制器方法

复制代码

 1     /**
 2      * 到登录界面
 3      * 
 4      * @return
 5      * @throws Exception
 6      */
 7     @RequestMapping("login.do")
 8     public String adminPage(HttpServletRequest request) throws Exception {
 9         // 如果登陆失败从request中获取认证异常信息,shiroLoginFailure就是shiro异常类的全限定名
10         String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
11         // 根据shiro返回的异常类路径判断,抛出指定异常信息
12         if (exceptionClassName != null) {
13             if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
14                 // 最终会抛给异常处理器
15                 throw new CustomJsonException("账号不存在");
16             } else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
17                 throw new CustomJsonException("用户名/密码错误");
18             } else if ("randomCodeError".equals(exceptionClassName)) {
19                 throw new CustomJsonException("验证码错误 ");
20             } else {
21                 throw new Exception();// 最终在异常处理器生成未知错误
22             }
23         }
24         // 此方法不处理登陆成功(认证成功),shiro认证成功会自动跳转到上一个请求路径
25         // 登陆失败还到login页面
26         return "admin/login";
27     }

复制代码

 

8.用户回显Controller

当用户登录认证成功后,CustomRealm在调用完doGetAuthenticationInfo时,通过

 1 AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(adminUser, password, this.getName()); 2 return authcInfo; 

 

SimpleAuthenticationInfo构造参数的第一个参数传入一个用户的对象,之后,可通过Subject subject = SecurityUtils.getSubject();中的subject.getPrincipal()获取到此对象。

所以需要回显用户信息时,我这样调用的

复制代码

 1     @RequestMapping("index.do")
 2     public String index(Model model) {
 3         //从shiro的session中取activeUser
 4         Subject subject = SecurityUtils.getSubject();
 5         //取身份信息
 6         TAdminUser adminUser =     (TAdminUser) subject.getPrincipal();
 7         //通过model传到页面
 8         model.addAttribute("adminUser", adminUser);
 9         return "admin/index";
10     }

复制代码

9.在jsp页面中控制权限

先引入shiro的头文件

 1 <!-- shiro头引入 --> 2 <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%> 

采用shiro标签对权限进行处理

1 <!-- 有curd权限才显示修改链接,没有该 权限不显示,相当 于if(hasPermission(curd)) -->
2                 <shiro:hasPermission name="curd">
3                     <BR />
4                     我拥有超级的增删改查权限额
5                 </shiro:hasPermission>

 

10.在Controller控制权限

通过@RequiresPermissions注解,指定执行此controller中某个请求方法需要的权限

1 @RequestMapping("/queryInfo.do")
2     @RequiresPermissions("q")//执行需要"q"权限
3     public ModelAndView queryItems(HttpServletRequest request) throws Exception {

11.MD5加密加盐处理

这里以修改密码为例,通过获取新的密码(明文)后通过MD5加密+加盐+6次加密为例

复制代码

 1 @RequestMapping("updatePassword.do")
 2     @ResponseBody
 3     public String updateAdminUserPassword(String newPassword) {
 4         // 从shiro的session中取activeUser
 5         Subject subject = SecurityUtils.getSubject();
 6         // 取身份信息
 7         TAdminUser adminUser = (TAdminUser) subject.getPrincipal();
 8         // 生成salt,随机生成
 9         SecureRandomNumberGenerator secureRandomNumberGenerator = new SecureRandomNumberGenerator();
10         String salt = secureRandomNumberGenerator.nextBytes().toHex();
11         Md5Hash md5 = new Md5Hash(newPassword, salt, 6);
12         String newMd5Password = md5.toHex();
13         // 设置新密码
14         adminUser.setPassword(newMd5Password);
15         // 设置盐
16         adminUser.setSalt(salt);
17         adminUserService.updateAdminUserPassword(adminUser);
18         return newPassword;
19     }

复制代码

ok!编码完成后对此WEB程序跑一下,截图符几张:

当前用户信息和权限信息表截图如下

系统管理员表:

权限表:

管理员权限关系中间表:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiro采用shiro实现登录认证与权限授权管理 的相关文章

  • SpringBoot整合shiro-spring-boot-web-starter启动报错

    最近在做一个SpringBoot整合常用框架的系统 在整合Shiro时启动就报错 现将解决办法总结如下 SpringBoot使用的是最新的2 3 4版本 Shiro使用的是shiro spring boot web starter1 6 0
  • springboot2+shiro+redis限制同一账号同时在线人数

    springboot2 shiro redis限制同一账号同时在线人数 我们在写系统的时候 需要注意账号安全问题 最好的处理方法就是同一个账号只能在一个地方登录 原理 大概的原理就是每次登录的时候将登录的sessionId存入缓存 然后登录
  • SpringBoot+Shiro实现免密登录

    1 自定义登录认证规则 import org apache shiro authc UsernamePasswordToken public class EasyUsernameToken extends UsernamePasswordT
  • SpringMVC+Shiro整合配置文件详解

    在项目中xml文件的配置是必不可少的 特别是SpringMVC框架 但是几乎所有项目的配置都是大同小异 很多人都是直接复制黏贴了事 不少人对其具体含义及用途都不甚全知 本片文章将正对项目中常用的框架SpringMVC Shiro进行整合 并
  • shiro基础

    shiro基础 shiro中有三大核心架构 subjects security manager realms 分别代表 使用shiro的主体 核心安全管理器和数据和安全管理的连接 使用shiro首先需要引入shiro需要的依赖 可以通过ma
  • spring+shiro多节点session共享

    shiro我就不多介绍了 我的方案是重写 shiro的sessionDAO 把session存储到redis上 直接上代码 一 spring中配置
  • SpringBoot基本操作(七)——SpringBoot整合Shiro权限管理(完整demo+界面)

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • 升级SpringBoot版本导致NoSuchMethodError: redis/clients/jedis/ScanResult.getStringCursor()

    今天在对SpringBoot项目升级的时候 把2 1 8 RELEASE 升级到了 2 3 2 RELEASE 2 3 2 2 4 2区间内的版本是这样 其他的springboot版本 本人没试过 运行后发现 在获取在线用户的时候 报了一个
  • shiro SecurityManager简介说明

    转自 shiro SecurityManager简介说明 下文笔者讲述Shiro SecurityManager的相关简介说明 如下所示 SecurityManager是Shiro框架的核心 典型的Facade模式 Shiro通过Secur
  • Java面试题--shiro

    Shiro可以做哪些工作 Shiro可以帮助我们完成 认证 授权 加密 会话管理 与Web集成 缓存等 shiro有哪些组件 Authentication 身份认证 登录 验证用户是不是拥有相应的身份 Authorization 授权 即权
  • springboot使用shiro的@Requiresroles注解不起作用(解决方法)

    看shiro的视频发现 Requiresroles不生效 解决方法 spring容器中 Bean public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator DefaultAd
  • shiro实现基于redis的sessionDao

    shiro实现基于redis的sessionDao 将session持久化到数据库的一个关键步骤是对session对象的序列化和反序列化操作 另外在使用redis保存session时一定要设置过期时间 或在编码中检查过期并及时删除缓存 否则
  • shiro框架---关于用户登录退出接口的介绍

    接上一篇文章shiro框架 shiro配置用户名和密码的注意 项目已分享到GitHub上 如果需要的可以看下 springboot shiro项目Git下载地址 在我前几篇文章里有shiro配置的文件下载包 下载后里边有四个配置文件Shir
  • Spring Boot的shiro整合(中)

    一 配置 1 MyShiroRealm类 package com wzq shiro config import javax annotation Resource import org apache shiro authc Authent
  • 【shiro】shiro反序列化漏洞综合利用工具v2.2(下载、安装、使用)

    目录 1 工具下载 2 依赖环境安装 3 使用 1 工具下载 shiro反序列化漏洞综合利用工具v2 2下载 链接 https pan baidu com s 1kvQEMrMP PZ4K1eGwAP0 Q pwd zbgp 提取码 zbg
  • 如何在Java中实现行级安全性?

    我目前正在评估身份验证 授权框架 Apache Shiro 看起来很好 但我是缺少行级安全性特征 例如 数据库中可能存在特殊行 这些行只能由具有特殊权限的用户可见和访问 为了避免不必要的往返 我们当前修改 SQL 查询以与我们的授权数据连接
  • 适合新手的 Apache Shiro 和 Java 安全性

    我对 Java 的安全模型几乎一无所知 包括 XML 配置 策略设置 任何安全框架组件 工具 例如密钥库等 以及介于两者之间的所有内容 虽然我明白最终会变成基本的对于我来说 卷起袖子深入学习 Java 安全性 我想知道使用 Apache S
  • Shiro/Stormpath 通过 REST

    我是新来的士郎 我们正在尝试将 Shiro 与 Stormpath 一起使用 我一直在尝试剖析这些例子 以找出我想做的解决方案 但到目前为止我还没有成功 目前 我只是尝试创建 REST 服务来执行我想要的操作 稍后我将绑定一个真正的客户端
  • 如何配置 JDBCRealm 从 JNDI 获取其数据源

    你如何使用JDBCRealm在 servlet 中处理用户身份验证和授权 我能找到的唯一示例是在中创建数据源web xml 例如使用 shiro 1 2 1 对数据库进行身份验证 https stackoverflow com questi
  • 如何在生产中安全地更改会话 cookie 域或名称?

    我们最近意识到我们的会话 cookie 正在被写入我们网站的完全限定域名 www myapp com 例如 MYAPPCOOKIE 79D5DB83 domain www myapp com 我们希望将其切换为可以跨子域共享的cookie

随机推荐

  • JAVA 内部类 inner class

    内部类 在一个类的内部定义的类称为内部类 类的内部 第一 与属性或方法 同级 内部类 这个类与外部类的每个对象是一对一的关系 Person与Birthday 静态内部类 这个类与外部类是1对1的关系 每个对象共享这个内部类对象 Hero和C
  • 编程实用工具大全(二)(前后端皆可用,不来看看?)

    个人主页 个人主页 系列专栏 精品推荐 由于之前编程实用工具大全深受大家喜欢 所以出了第二期 对于没有看过第一期的小伙伴 可以点击这个链接 编程实用工具大全 一 目录 1 零代码工具箱 专为前端打造 1 SVG波浪背景生成器 2 在线生成
  • Activity启动流程概述

    总结 Activity的启动过程 我们可以从Context的startActivity说起 其实现是ContextImpl的startActivity 内部调用startActivityForResult 然后内部会通过Instrument
  • Mathpix公式识别OCR软件使用教程

    最近 发现一款公式识别OCR软件 配合Mathtype 公式编辑器 非常好用 省去很多时间 所以就写一篇文章介绍Mathpix的使用方法 1 打开Mathpix软件后 可以鼠标单击下图中小电脑图标进行截图 也可以使用快捷键Ctrl Alt
  • IntelliJ IDEA基于maven构建的web项目找不到jar包

    手把手教你搭建基于Maven的SSM框架 附源代码 SSM框架 详细整合教程 GitHub源码地址 SSM整合框架 基于maven构建的springMVC项目 下载好jar包import后 运行提示ClassNotFoundExceptio
  • 数仓/数据开发-零基础入坑(小白学习路径)

    这段时间各大公司的春招陆续开始了 但是也有很多同学还在因为刚刚入坑或者还在纠结 对学习路径比较迷茫 这也是去年的我 所以这边总结一下 一个面向面试的学习路径 后面也会补充上全面的学习路径 面向面试就是掌握到基本能应付暑期实习面试的基本技能和
  • 论文笔记之CSPNet

    本文解决的是减少推理计算的问题 本文收录于CVPR2019 论文地址 https arxiv org pdf 1911 11929 pdf 1 摘要 目前最先进的能够在计算机视觉任务上取得非常好的结果的方法往往很大程度上依赖于昂贵的计算资源
  • Window Server IIS日志导入到SQL Server查看

    配置ODBC log日志可以导出到提供ODBC访问接口的数据库查看 控制面板 ODBC 添加DSN gt SQL Server 起个名称 随意命名 下一步 选择数据库 下一步 默认就行 点完成 测试数据源 点击确定 点击应用 确定 打开lo
  • Error:Could not create the Java Virtual Machine. Error:A Fatal exception has occurred错误解决

    问题情况 出现以上情况 可以通过以下方式进行解决 1 判断机子是否安装了Java环境 确定自己已经设置环境变量 如JAVA HOME CLASSPATH PATH 2 有些程序会有内存设置 有些程序内存设置过大时 超过虚拟机的范围会报错 3
  • 剑指offer——剪绳子

    题目描述 给你一根长度为n的绳子 请把绳子剪成整数长的m段 m n都是整数 n gt 1并且m gt 1 每段绳子的长度记为k 0 k 1 k m 请问k 0 xk 1 x xk m 可能的最大乘积是多少 例如 当绳子的长度是8时 我们把它
  • Backtrader量化&回测5——交易情况跟踪&生成策略每日交易报告

    这一部分的API可以参考官网 https www backtrader com docu strategy Backtrader的策略中有四个常用的函数 notify order order 订单状态变化时会触发这个函数 notify tr
  • get请求传参 数组

    假设现在有数组arr 1 2 axios中如果直接使用数组传参 会出现参数中数组变成arr 1 arr 2的情况 实际上后端需要的是arr 1 arr 2的效果 这个时候可以使用axios里面的qs 导入 import qs from qs
  • 数据中心如何助力大数据、区块链、人工智能结合应用,推动数字经济发展?

    同属新基建重点点名发展的技术高地 大数据 区块链 人工智能之间有联系吗 数据中心如何承担技术底座的作用 以促进这些新兴技术的结合发展和应用 继而推动数字经济的发展 用人体来比喻 我们人类的各个器官感知世间万物的一切 大数据 经过人体经络 区
  • 2019年国赛高教杯数学建模E题薄利多销分析解题全过程文档及程序

    2019年国赛高教杯数学建模 E题 薄利多销分析 原题再现 薄利多销 是通过降低单位商品的利润来增加销售数量 从而使商家获得更多盈利的一种扩大销售的策略 对于需求富有弹性的商品来说 当该商品的价格下降时 如果需求量 从而销售量 增加的幅度大
  • 解决 Error querying database. Cause: java.sql.SQLException: sql injection violation....

    解决 Error querying database Cause java sql SQLException sql injection violation 最近在开发的时候老板的需求就是将模糊搜索和PageHelper 结合起来将数据显示
  • Vuex状态管理

    1 vuex是什么 Vuex 是一个专为 Vue js 应用程序开发的状态管理模式 集中式存储管理应用的所有组件的状态 简单的状态管理模式 state 驱动应用的数据源 view 以声明方式将 state 映射到视图 actions 响应在
  • 电脑安装两个jdk版本无法切换 同时安装JDK8和JDK16 配置JAVA_HOME为JDK8但 java 和 javac 版本都是16

    JDK8是目前最稳定使用最多的版本 大厂开发都使用JDK8 JDK16是目前最新版 问题描述 同一台电脑同时安装了JDK8和JDK16 先安装了JDK16后安装的JDK8 设置JAVA HOME指定给JDK8版本 但是java 和 java
  • QT 获取系统版本号并且识别出对应的Windows系统信息,包括windows11

    在QT中使用QSysInfo类来获取系统版本号 可以使用QSysInfo windowsVersion 函数来识别Windows系统信息 可能的返回值包括QSysInfo WV 32s QSysInfo WV 95 QSysInfo WV
  • Linux提示 /usr/bin/ld:cannot find-lxxx 系列解决方法

    一般把xx so文件复制到 usr lib 这篇文章主要介绍了Linux系统中提示 usr bin ld cannot find lxxx错误的通用解决方法 本文以Ubuntu为例给出了一个解决例子 其它linux系统也适用 需要的朋友可以
  • Shiro采用shiro实现登录认证与权限授权管理

    Shiro 是一个 Apache 下的一开源项目项目 旨在简化身份验证和授权 spring springMVC maven shiro shiro的配置 通过maven加入shiro相关jar包 1 shiro的配置 通过maven加入sh