springboot整合shiro排雷

简介: Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

springboot整合shior初体验


什么是shiro?


Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。


1.JPG

他有三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。 Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

2.JPG


快速开始


  • 引入maven坐标
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
<!--shiro整合spring的包-->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.5.3</version>
</dependency>
复制代码


  • 编写config文件
package com.config;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
//shiro的配置类
@Configuration
public class ShiroConfig {
    //第三步:ShiroFilterFactoryBean(看源码需要传入哪些值)
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager defaultSecurityManager){
        ShiroFilterFactoryBean  shiroFilterFactoryBean =new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager);
        //添加shiro的内置过滤器
           /* anno: 无需认证就可以访问
              authc:必须认证了才可以访问
              user: 必须拥有记住我功能才可以用
              perms:拥有对某个资源的权限才可以访问
              role:拥有某个角色权限才可以访问
           * */
        Map<String,String> filterMap =new HashMap<String, String>();
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        filterMap.put("/user/add","authc");//只有认证了才可以访问/user/add页面
        filterMap.put("/user/update","authc");
        return shiroFilterFactoryBean;
    }
    //第二步获取DafaultWebSecurityManager
    @Bean(name = "securityManager")//不用默认的方法名充当名字,自己设置一个
    public DefaultSecurityManager getWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){//绑定userRealm
        DefaultWebSecurityManager webSecurityManager =new DefaultWebSecurityManager();
        //关联userRealm
        webSecurityManager.setRealm(userRealm);
        return webSecurityManager;
    }
    //第一步,创建realm对象,需要自定义
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }//自定义的UserRealm类被spring托管
}
复制代码


  • 创建测试html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>首页</h1>
    <hr>
    <a th:href="@{/user/add}">add</a>
    <a th:href="@{/user/update}">update</a>
</body>
</html>
复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        add
</body>
</html>
复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    update
</body>
</html>
复制代码


开始测试


登陆界面:


3.JPG


点击图中的add按钮:

4.JPG


点击图中的update按钮:

5.JPG


均为没有权限,无法访问网站


改进思路


如果没有权限,应该跳转到登陆页面,而不是直接报404错误,所以需要添加登录页和修改部分代码


添加登录页


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>登陆</h1>
    <hr>
    <form action="/login">
        <p>账号:<input type="text" name="usermame"></p>
        <p>密码:<input type="text" name="password"></p>
        <input type="submit" value="登陆">
    </form>
</body>
</html>
复制代码


修改Controller


添加了登陆的方法


package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ShiroController {
    @RequestMapping({"/","/index"})
    public String toindex(){
        return "index";
    }
    @RequestMapping({"/user/add"})
    public String add(){
        return "user/add";
    }
    @RequestMapping({"/user/update"})
    public String update(){
        return "user/update";
    }
    @RequestMapping({"/login"})
    public String login(){
        return "user/login";
    }
}
复制代码


修改config文件


添加setLoginUrl方法


package com.config;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
//shiro的配置类
@Configuration
public class ShiroConfig {
    //第三步:ShiroFilterFactoryBean(看源码需要传入哪些值)
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager defaultSecurityManager){
        ShiroFilterFactoryBean  shiroFilterFactoryBean =new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager);
        //添加shiro的内置过滤器
           /* anno: 无需认证就可以访问
              authc:必须认证了才可以访问
              user: 必须拥有记住我功能才可以用
              perms:拥有对某个资源的权限才可以访问
              role:拥有某个角色权限才可以访问
           * */
        Map<String,String> filterMap =new HashMap<String, String>();
        filterMap.put("/user/add","authc");//只有认证了才可以访问/user/add页面
        filterMap.put("/user/update","authc");
        //filterMap.put("/user/*","authc"); 支持通配符写法
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        shiroFilterFactoryBean.setLoginUrl("/login");//设置登陆请求
        return shiroFilterFactoryBean;
    }
    //第二步获取DafaultWebSecurityManager
    @Bean(name = "securityManager")//不用默认的方法名充当名字,自己设置一个
    public DefaultSecurityManager getWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){//绑定userRealm
        DefaultWebSecurityManager webSecurityManager =new DefaultWebSecurityManager();
        //关联userRealm
        webSecurityManager.setRealm(userRealm);
        return webSecurityManager;
    }
    //第一步,创建realm对象,需要自定义
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }//自定义的UserRealm类被spring托管
}
复制代码


再次测试


6.JPG


点击add(update)

7.JPG


okk!!第一次使用springboot整合shiro结束了,接下来我会继续学习!



相关文章
|
5月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
785 0
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
465 0
|
9月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
347 0
|
6月前
|
缓存 安全 Java
Shiro简介及SpringBoot集成Shiro(狂神说视频简易版)
Shiro简介及SpringBoot集成Shiro(狂神说视频简易版)
525 7
|
安全 Java Apache
SpringBoot+Shiro(一)
SpringBoot+Shiro(一)
|
11月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
775 11
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
362 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
3190 2
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
Java API Apache
Springboot+shiro,完整教程,带你学会shiro
这篇文章提供了一个完整的Apache Shiro与Spring Boot结合使用的教程,包括Shiro的配置、使用以及在非Web和Web环境中进行身份验证和授权的示例。
772 2
Springboot+shiro,完整教程,带你学会shiro
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
321 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。