spring整合shiro(含MD5加密)(下)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: spring整合shiro(含MD5加密)

授权:


需求描述:


1、指定角色:


AdminController只有具有admin角色(tom)才能访问;

GuestController只有具有guest角色(cat)才能访问;


2、指定权限:


PermissionController只有具有create权限(tom和cat)的用户才能访问;


涉及知识点:


1、在spring-shiro.xml中进行授权验证

2、注解方式授权验证

3、jsp中授权验证

4、多级路由匹配规则


正式开始:


1、AdminController.java

@Controller
@RequestMapping("/admin")
public class AdminController {
    /**
     *
     * @param user
     * @param request
     * @return
     */
    @RequestMapping("/test")
    public String adminTest() {
        //Subject subject = SecurityUtils.getSubject();
        //if(subject.hasRole("admin")) {
            return "admin";
        //}else {
        //  return "login";
        //}
    }
}


这个授权验证写在spring-shiro.xml中:/admin/**=authc,roles[admin],这样就表示要有admin这个角色的用户才能访问。同时这个也是双重路由,/admin/**就表示拦截admin开头的路由。


2、GuestController.java

public class GuestController {
    @RequiresRoles("guest")
    @RequestMapping("/guest")
    public String guestTest() {
        return "guest";
    }
}


这个是使用注解方式进行权限验证的,@RequiresRoles("guest")就表示要有guest这个角色才能访问这个路由。


3、PermissionsController.java

@Controller
public class PermissionsController {
    /**
     *
     * @param user
     * @param request
     * @return
     */
    @RequestMapping("/permissions")
    public String permissionTest(){
        Subject subject = SecurityUtils.getSubject();
        if(subject.isPermitted("create")) {
            return "permission";
        }else {
            return "login";
        }
    }
}


这个是直接在Controller中获取到登录用户,然后用Subject对象的isPermitted方法就行判断。subject.isPermitted("create")用来判断登录的用户是否有create权限,有就true,没有就是false。


4、接下来看看前端页面:


①success.jsp


登录成功跳转到这个页面

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
       欢迎你!
    <br>
    <a href="http://localhost:8080/shiroweb/admin/test">有admin角色才能访问</a>
    <br>
    <a href="http://localhost:8080/shiroweb/permissions">有create权限就可以访问</a><br>
    <a href="http://localhost:8080/shiroweb/guest">guest才能访问</a>
</body>
</html>


这里定义了三个链接,分别指向上面那三个controller。


②admin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  欢迎有admin角色的你!
</body>
</html>


③guest.jsp

pageEncoding="utf-8"%>
    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
   <shiro:hasRole name="guest">
        欢迎guest!(只有guest角色登录进来才能显示这段话)<shiro:principal/>
    </shiro:hasRole>
    <shiro:hasRole name="admin">
        欢迎admin!(只有admin角色登录进来才能显示这段话)<shiro:principal/>
    </shiro:hasRole>
</body>
</html>


这里就用到了jsp标签形式判断角色,<shiro:hasRole name="#">xxx</shiro:hasRole>就是用来判断当前用户有没有#角色,有#角色才会显示xxx内容。


注意:使用shiro的jsp标签要在jsp页面中添加

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


④permission.jsp

pageEncoding="UTF-8"%>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  欢迎有你! <shiro:hasPermission name="delete">
     只有拥有delete权限的人登录进来才能显示这段话.<shiro:principal/>
    </shiro:hasPermission>
</body>
</html>


这里用到了<shiro:hasPermissionname="#">xxx</shiro:hasPermission>来判断权限,只有具有#权限的用户才会显示xxx内容。


⑤unauthor.jsp

pageEncoding="utf-8"%>
    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
  对不起,你没有操作权限!
  <a href="login.jsp">点此登录</a>
</body>
</html>


权限认证失败时跳转到此页面,因为在spring-shiro.xml中配置过。


四、项目测试


1、用tom登录


分析:tom具有admin角色和所有权限,所以success.jsp页面的前两个链接可以访问,且permission.jsp的<shiro:hasPermission name="delete">标签里面的话会显示。


第三个链接不能访问,会抛出异常,因为需要guest角色才能访问。


结果:


image.png

image.png

image.png

image.png

image.png


2、用cat登录


分析:cat具有guest角色和create 以及query权限,所以success.jsp的第一个链接不能访问,会跳转到unauthor.jsp,第二个链接可以访问,但是不能显示

<shiro:hasPermission name="delete">标签里面的话,第三个链接可以访问,且能显示<shiro:hasRole name="guest">里面的话。


结果:


image.pngimage.pngimage.pngimage.png

image.png

image.png

所有结果符合预期,测试通过!


五、知识点补充


1、url匹配规则:


/admin?=authc


表示admin1需要认证,admin2也需要,但是admin不一定,因为问号表示单个字符


/admin*=authc


表示admin1需要认证,admin21需要,admin也需要,*号表示一个或多个字符


/admin/**=authc


可以匹配多路径,比如admin/a/b


2、


Subject对象除了isPermitted("#")判断是否拥有#权限,还有hasRole("#")判断是否有#角色,hasRoles(Arrays.asList("role1","role2"))来判断是否有role1和role2角色。


3、其他注释:


@RequiresAuthentication

表示要验证通过才能被访问

@RequiresGuest

表示之前session中没有被验证过才能访问

@RequiresPermissions("create")

表示有create权限才能访问

@RequiresRoles("admin")

只有admin这个角色才能访问

@RequiresUser

指定用户才能访问


总结:


shiro提供了认证登录,授权,密码加密等功能,方便易用。授权可以在spring-shiro中定义过滤链,可以使用注释,也可以在controller 方法中用Subject对象的方法判断,还可以在jsp中使用标签。


以上内容是个人学习笔记整理,如有错误,欢迎批评指正!




相关文章
|
2月前
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
|
1月前
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
30 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
26天前
|
存储 安全 Java
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
30 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
16天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
31 0
|
1月前
|
存储 安全 Java
shiro学习二:shiro的加密认证详解,加盐与不加盐两个版本。
这篇文章详细介绍了Apache Shiro安全框架中密码的加密认证机制,包括不加盐和加盐两种加密方式的实现和测试。
84 0
|
1月前
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
|
1月前
|
IDE 开发工具 数据安全/隐私保护
Python编程实现批量md5加密pdf文件
Python编程实现批量md5加密pdf文件
|
3月前
|
安全 Java 数据库
Spring Boot中集成 Shiro
本节主要介绍了 Shiro 安全框架与 Spring Boot 的整合。先介绍了 Shiro 的三大核心组件已经它们的作用;然后介绍了 Shiro 的身份认证、角色认证和权限认证;最后结合代码,详细介绍了 Spring Boot 中是如何整合 Shiro 的,并设计了一套测试流程,逐步分析 Shiro 的工作流程和原理,让读者更直观地体会出 Shiro 的整套工作流程。Shiro 使用的很广泛,希望读者将其掌握,并能运用到实际项目中。
|
Java Spring
spring boot 集成websocket与shiro的坑
spring boot 集成websocket与shiro的坑
384 0