Shiro整合SpringBoot,实战下的应用场景

SpringBoot之整合Shiro(最详细) pom.xml 2.3 创建前端页面 在webapp文件夹中创建index.jsp和login.jsp index.jsp login.jsp 2.4 配置视图信息 application.properties 2.5 解决IDEA冲突问题 JSP 与IDEA 与SpringBoot存在一定的不兼容,修改此配置即可解决 pom.xml 3.2 自定义Realm 在shiro文件夹下创建realm文件夹 3.3 Shiro配置 在config文件夹中创建ShiroConfig.java 3.4 启动测试 输入 阅读详情


前言

整合springBoot+shiro流程:

  1. 环境准备
  2. 身份认证
    2.1 密码加密
    2.2 非法请求控制
  3. 授权,鉴权

一、springBoot+shiro环境准备

项目目录:
在这里插入图片描述

1.数据库

认证框架五表设计:
准备user用户表、user_role用户角色关系表、role角色表、 role_permission角色权限关系表、permission权限表;
user用户表:
在这里插入图片描述
user_role用户角色关系表:
在这里插入图片描述
role角色表:
在这里插入图片描述
role_permission角色权限关系表:
在这里插入图片描述
permission权限表:
在这里插入图片描述

2.ssmp环境搭建

2.1准备依赖

		<!--web启动器-->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		<!--test启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

		<!--Mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
            <scope>runtime</scope>
        </dependency>
        <!--Mybatisplus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
        <!--lombok作用于实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
		<!--shiro相关坐标-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>${shiro.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>${shiro.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>${shiro.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-ehcache</artifactId>
            <version>${shiro.version}</version>
        </dependency>

2.2 配置Yaml文件

#数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    url: jdbc:mysql://localhost:3306/shiro?serverTimezone=GMT
    password: 12345678
#Mybatisplus配置
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.实体类

User用户类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("pe_user")
public class User implements Serializable {
    @TableId(value = "id",type = IdType.NONE)
    private String id;
    @TableField(value = "username")
    private String username;
    @TableField(value = "password")
    private String password;
    @TableField(value = "salt")
    private String salt;
    @TableField(exist = false)
    private Set<Role> roles;
}

role角色类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("pe_role")
public class Role implements Serializable {

    private  String id;
    private  String name;
    private  String code;
    private  String description;

    private Set<Permission> permissions;
}

Permission 权限类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("pe_permission")
public class Permission implements Serializable {
    private  String id;
    private  String name;
    private  String code;
    private  String escription;
}

4.三层搭建

DAO层: 因为是五表构造,需要处理关联关系,所以在这里使用级联查询的方式实现:
UserMapper :

@Mapper
public interface UserMapper extends BaseMapper<User> {
    @Select("select * from pe_user where username =#{username}")
    User findByName(String name);
    
    @Select("select * from pe_user where id =#{id}")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "username",column = "username"),
            @Result(property = "password",column = "password"),
            @Result(property = "salt",column = "salt"),
            @Result(property = "roles",column = "id",
                    many = @Many(select = "com.apesource.springboot_shiro_01.dao.RoleMapper.findRoleById"))
    })
    User findUserDetailById(int id);
}

RoleMapper :

@Mapper
public interface RoleMapper {
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "name", property = "name"),
            @Result(column = "code", property = "code"),
            @Result(column = "description", property = "description"),
            @Result(column = "id",property = "permissions",
                    many = @Many(select = "com.apesource.springboot_shiro_01.dao.PermissionMapper.findPermissionById"))

    })
//    @Select("select  *  from 角色表 where 角色id in (select 角色ID from 关系表 where 用户id = ?)")
    @Select("select  *  from pe_role where id in (select role_id from pe_user_role where user_id = #{id})")
    public Set<Role> findRoleById(String id);
}

PermissionMapper :

@Mapper
public interface PermissionMapper {
    @Select("select  *  from pe_permission where id in (select permission_id from pe_role_permission where role_id = #{id})")
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "name", property = "name"),
            @Result(column = "code",property = "code"),
            @Result(column = "description", property = "description")
    })
    public Set<Permission> findPermissionById(long id);
}

Service层: 因为项目只实现Shrio的用户认证和授权,所以只构造User的业务层就足够了。
UserService :

@Service
public class UserService {
    @Autowired(required = false)
    UserMapper mapper;
    public User findByName(String name){
        return mapper.findByName(name);
    }
    public User findUserDetailById(int id){
        return mapper.findUserDetailById(id);
    }
}

Controller层:

@RestController
public class ShiroController {
    @Autowired
    UserService service;

    /**
     * @RequiresPermissions()  -- 访问此方法必须具备的权限
     *  @RequiresRoles()        -- 访问此方法必须具备的角色
     *
     */

    @RequiresPermissions("user-home")
    @RequestMapping(value = "/user/home")
    public String home() {
        return "访问个人主页成功";
    }

    //添加
    @RequiresPermissions("user-add")
    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String add() {
        return "添加用户成功";
    }

    //查询
    @RequiresPermissions("user-find")
    @RequestMapping(value = "/user/find",method = RequestMethod.GET )
    public String find(){
        return "查询成功";
    }
    //更新
    @RequiresPermissions("user-update")
    @RequestMapping(value = "/user/{id}",method = RequestMethod.PUT)
    public String update(@PathVariable String id) {
        return "更新用户成功";
    }

    //删除
    @RequiresPermissions("user-delete")
    @RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
    public String delete(@PathVariable String id) {
        return "删除用户成功";
    }

    //未登陆与未授权页面
    @RequestMapping(value="/autherror")
    public String autherror() {
        return "未登录";
    }

    //用户登录
    @RequestMapping(value="/login")
    public String login(User user) {
        try {
            //1.构造登录令牌
            UsernamePasswordToken upToken = new UsernamePasswordToken(user.getUsername(),user.getPassword());
            //2.获取subject
            Subject subject = SecurityUtils.getSubject();
            //3.调用subject进行登录
            subject.login(upToken);
            return "登录成功";
        }catch (Exception e) {
            e.printStackTrace();
            return "用户名或密码错误";
        }
    }
}

5.初始化测试数据

因为在实战场景下,数据库的密码是不可以明文保存的,这样对于数据的安全性是巨大的隐患,而shiro也支持数据加密的功能。
加密工具类:

public class DigestUtil {
    //算法方式
    public static final String SHA1 = "SHA-1";
    public static final String SHA256 = "SHA-256";

    //加密次数
    public static final Integer Counts =369;

    /**
     * @Description show
     * @param input 需要散列字符串
     * @param salt 盐字符串
     * @return
     */
    public static String show(String input,String salt){
        return new SimpleHash(SHA1,input,salt,Counts).toString();
    }
    /**
     * @Description 随机获得salt字符串
     * @return
     */
    public static String generateSalt(){
        SecureRandomNumberGenerator randomNumberGenerator =new SecureRandomNumberGenerator();
        return randomNumberGenerator.nextBytes().toHex();
    }
    /**
     * @Description 生成密码字符密文和salt密文
     * @param
     * @return
     */
    public static Map<String,String> entryptPassword(String passwordPlain){
        Map<String,String> map = new HashMap<>();
        String salt =generateSalt();
        String password = show(passwordPlain,salt);
        map.put("salt",salt);
        map.put("明文password",passwordPlain);
        map.put("密文密码",password);
        return map;
    }

由于没有实现注册功能,所以对于数据库的密文密码通过自己操作工具类输入进去:

    public static void main(String[] args) {
        String name ="张三丰";
        String password = "123123";
        Map<String, String> map = entryptPassword(password);
        System.out.println(map.toString());
    }

二、Shiro过滤器

Shiro内置了很多默认的过滤器,比如身份验证、授权等相关的,shiro也是通过过滤器的原理来实现认证和授权的扩展功能的。

1.Shiro认证过滤器

在这里插入图片描述

2.Shiro授权过滤器

在这里插入图片描述

三、springBoot+shiro身份认证

1.创建Realm,重写认证方法doGetAuthenticationInfo

使用@PostConstruct注解修饰的init方法就会在Spring容器的启动时自动的执行

public class MyRealm extends AuthorizingRealm {
    @Autowired
    UserService service;
     /**
     * @Description 自定义密码比较器
     * bean标签 init-method属性
     */
     @PostConstruct
    public void initCredentialsMatcher() {
        //指定密码算法
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(DigestUtil.SHA1);
        //指定迭代次数
        hashedCredentialsMatcher.setHashIterations(DigestUtil.Counts);
        //生效密码比较器
        setCredentialsMatcher(hashedCredentialsMatcher);
    }
}
    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
		//1.获取登录的用户名密码(token)
        UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
        String username = token.getUsername();
		//2.根据用户名查询数据库
        User user  = service.findByName(username);
        //3.判断用户是否存在或者密码是否一致
        if(user==null){
            throw new UnknownAccountException("账户不存在");
        }
        //4.如果一致返回安全数据
        //通过SimpleAuthenticationInfo校验数据
        //构造方法:安全数据,密码(匿名),混淆字符串(salt),realm域名
        return new SimpleAuthenticationInfo(user.getId(),user.getPassword(), ByteSource.Util.bytes(user.getSalt()),"MyRealm");
    }

2.创建shiro配置类

shiro配置类需要配置八个步骤,比较繁琐,最重要的是shiroFilter过滤器,用于实现非法请求的处理。

@Configuration
public class ShiroConfiguration {

    /**
     * 1.创建shiro自带cookie对象
     */
    @Bean
    public SimpleCookie sessionIdCookie(){
        SimpleCookie simpleCookie = new SimpleCookie();
        simpleCookie.setName("ShiroSession");
        return simpleCookie;
    }

    //2.创建realm
    @Bean
    public MyRealm getRealm() {
        return new MyRealm();
    }

    /**
     * 3.创建会话管理器
     */
    @Bean
    public DefaultWebSessionManager sessionManager(){
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        sessionManager.setSessionValidationSchedulerEnabled(false);
        sessionManager.setSessionIdCookieEnabled(true);
        sessionManager.setSessionIdCookie(sessionIdCookie());
        sessionManager.setGlobalSessionTimeout(3600000);
        return sessionManager;
    }

    //4.创建安全管理器
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(getRealm());
        securityManager.setSessionManager(sessionManager());
        return securityManager;
    }
    
    /**
     * 5.保证实现了Shiro内部lifecycle函数的bean执行
     */
    @Bean(name = "lifecycleBeanPostProcessor")
    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    /**
     * 6.开启对shiro注解的支持
     *   AOP式方法级权限检查
     */
    @Bean
    @DependsOn("lifecycleBeanPostProcessor")
    public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
        return defaultAdvisorAutoProxyCreator;
    }

    /**
     * 7.配合DefaultAdvisorAutoProxyCreator事项注解权限校验
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(defaultWebSecurityManager());
        return authorizationAttributeSourceAdvisor;
    }

    //8.配置shiro的过滤器工厂再web程序中,shiro进行权限控制全部是通过一组过滤器集合进行控制
    @Bean
    public ShiroFilterFactoryBean shiroFilter() {
        //1.创建过滤器工厂
        ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean();
        //2.设置安全管理器
        filterFactory.setSecurityManager(defaultWebSecurityManager());
        //3.通用配置(跳转登录页面,为授权跳转的页面)
        filterFactory.setLoginUrl("/autherror");//跳转url地址
        //4.设置过滤器集合
        //key = 拦截的url地址
        //value = 过滤器类型
        Map<String,String> filterMap = new LinkedHashMap<>();
        //key:请求规则   value:过滤器名称
        filterMap.put("/login","anon");//当前请求地址可以匿名访问
        filterMap.put("/user/**","authc");//当前请求地址必须认证之后可以访问
        //在过滤器工程内设置系统过滤器
        filterFactory.setFilterChainDefinitionMap(filterMap);
        return filterFactory;
    }
}

3.Postman测试

成功:
在这里插入图片描述
合法请求资源:
在这里插入图片描述

失败:
在这里插入图片描述
非法请求资源:
在这里插入图片描述


四、springBoot+shiro授权,鉴权

1.重写授权方法doGetAuthenticationInfo

授权方法:
操作的时候,判断用户是否具有响应的权限
一定先认证再授权
先认证 – 安全数据
再授权 – 根据安全数据获取用户具有的所有操作权限

//授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    	//1.获取已认证的用户数据
        String id1 = (String) principalCollection.getPrimaryPrincipal();

        int i = Integer.parseInt(id1);

        User user = service.findUserDetailById(i);
        //2.根据用户数据获取用户的权限信息(所有角色,所有权限)
        Set<String> roles = new HashSet<>();//所有角色
        Set<String> perms = new HashSet<>();//所有权限
        for (Role role : user.getRoles()) {
            roles.add(role.getName());
            for (Permission perm : role.getPermissions()) {
                perms.add(perm.getCode());
            }
        }
        //将角色和权限信息返回
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.setStringPermissions(perms);
        info.setRoles(roles);
        return info;
    }

2.访问程序资源(鉴权)

注解实现:直接在控制器接口上加注解即可;
注解实现权限:如果权限信息不匹配,抛出异常(则使用异常处理器解决);
常用注解:
@RequiresPermissions – 访问此方法必须具备的权限
@RequiresRoles – 访问此方法必须具备的角色
@RequiresAuthentication – 表明当前用户需是经过认证的用户
@ RequiresGuest --表明该用户需为”guest”用户
@ RequiresUser – 当前用户需为已认证用户或已记住用户

具体实现在controller层的每个业务接口,这里只举例一个:

	//个人主页
    @RequiresPermissions("user-home")
    @RequestMapping(value = "/user/home")
    public String home() {
        return "访问个人主页成功";
    }
 @RequiresPermissions("user-add")//参数:对应权限的code值
    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String add() {
        return "添加用户成功";
    }

3.全局异常处理器

专门用于处理权限不足的异常信息:

@ControllerAdvice
public class BaseExceptionHandler {
    @ExceptionHandler(value = AuthorizationException.class)
    @ResponseBody
    public String error(HttpServletRequest request, HttpServletResponse response, AuthorizationException e) {
        return "未授权-异常处理器实现";
    }
}

4.Postman测试

张三丰用户只有user-home权限,没有add权限;

1.直接访问权限方法会被拦截做登录:
在这里插入图片描述
2.访问有权限的资源
成功
在这里插入图片描述
3.访问没有权限的资源
失败,被全局异常处理器处理。
在这里插入图片描述


11springboot 整合shiro 中(session中的会话管理) 文章目录1 什么是shiro的会话管理2应用场景分析3 Shiro结合redis的统一会话管理4 步骤:4.1引入依赖4.2在springboot配置文件中添加redis配置4.3 自定义shiro会话管理器4.4配置Shiro基于redis的会话管理4.5user对象实现AuthCachePrincipal5 上传代码: 在shiro里所有的用户的会话信息都会由Shiro来进行控制,shiro提... 阅读详情

相关推荐

SpringBoot整合Shiro

Shiro简介   Apache Shiro是一个开源的轻量级的Java安全框架,它提供了身份认证、授权、密码管理、会话管理等操作。我们知道在Spring中也有一个跟它功能差不多的框架Spring Security,Shiro框架可以更加直观的提供安全性操作,在SSM框架中整合Shrio的配置步骤比较多。但是争对SpringBoot,在SpringBoot官方也提供了对应的启动器。这样的话化简了S...

初学者 2704

SpringBoot与Shiro整合

本文章介绍了Spring boot下shiro与thymeleaf、mybatis的整合过程,Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理

fangliangke的博客 6520

Shiro教程(二):Springboot整合Shiro全网最全教程

Apache Shiro是一个Java的安全权限框架。Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。- Shiro可以完成认证、授权、加密、会话管理、Web集成、缓存等。这里是SpringBoot整合Shiro最完整最详细教程。

WwLK123的博客 2113

springBoot整合Shiro(详细教程分析)

🚩1.1 什么是ShiroShiro是一个开源的Java安全框架,它提供了身份认证、授权、加密和会话管理等功能,可以帮助我们快速地构建安全可靠的应用程序。🚩1.2 为什么要用Shiro在开发Web应用程序时,安全性是一个非常重要的问题。使用Shiro可以帮助我们快速地构建安全可靠的应用程序,而且Shiro的使用非常灵活,可以根据我们的需求进行定制。

ggjklncffd的博客 6383

SpringBoot与Redis及Shiro整合实战演示

SpringBoot是Spring社区提供的一个开源框架,旨在简化Spring应用的创建和开发过程。它通过约定优于配置的原则,让开发者能够快速启动和运行Spring应用,同时提供了一组工具来简化Web应用、数据访问、安全性和消息传递等方面的配置。Apache Shiro是一个全面的Java/Java EE安全框架,提供了认证、授权、加密、会话管理等多种安全功能。它的核心架构包括Subject、SecurityManager、Realm和领域对象。Subject。

weixin_42596011的博客 1076

Spring Boot与JWT和Shiro整合实践教程

在现代企业级应用开发中,Spring Boot凭借其轻量级、快速开发的特性,已经成为构建微服务架构项目的首选框架。本章将为读者提供Spring Boot的入门级介绍,旨在帮助读者快速掌握Spring Boot的基础知识,并了解其在项目中的具体应用。Spring Boot是Spring的一个模块,它提供了快速构建项目的能力。通过“约定优于配置”的原则,Spring Boot旨在简化Spring应用的初始搭建以及开发过程。它通过提供默认配置,帮助开发者避免繁琐的配置工作,从而专注于业务逻辑的实现。

weixin_42611177的博客 1029

史上最全的Shiro学习整理-yellowcong

这些文章,都是我对shiro的人事精华,里面又很全的shiro案例,对于后期的shiro权限管理和开发又很大的好处。 shiro组件 Shiro之加密方式-yellowcong Shiro之多Realm的认证及认证策略-yellowcong Shiro之拦截器的使用-yellowcong Shiro之授权管理与授权的三种方式(1、编程方式,2、注解方式,3、jsp标签)-yel...

2352

Linux - xarray 工具类

第三层节点直接与绿色的值绑定,若需要像数组一样通过下标访问绿色的值对象那么需要给每一个节点进行编码,这样通过根节点即可访问到具体的对象。对于未使用到的小数组不申请空间,这样只需设计一种方法将这些非连续的小数组在一个数据结构中组织在一起即可,对于这个数组结构需要具有结构紧凑并且能够快速定位到对应的小数组段上,这时候树形结构上场了。一个很大的数组必然可以由一个个小数组拼接而成,若定义一个最小粒度的数组长度,比如长度4,那么从宏观上看一个大数组就由一个个长度为4的小数组排队而成。

ymf604的专栏 1085

Spring Boot Shiro原理系列

============================ _Spring Boot Shiro_视频实战篇 =============================== à_Spring Boot实战篇之Shiro_ http://study.163.com/course/courseMain.htm?courseId=1004523002&utm_campaign=commission&utm_source=400000000155061&utm_medium=share 网易云

m0_67401228的博客 166

【漆学军】MT4进阶到MT5速成之路(2)获取持仓

MT5在持仓获取上,要比MT4复杂些,分两部分,获取持仓和挂单采用了不同的方法。 一、获取持仓中的buy和sell单 int b=0;//获取buy单个数 int s=0;//获取sell单个数 double lot_total_buy=0;//获取持仓中buy单的总手数 double lot_total_sell=0;//获取持仓中sell单的总手数 for(int i=0; i<PositionsTotal(); i++) { ulong ticket=Positi

漆学军的编程笔记 1623

Zynq 双核AMP 通信

4、配置离线编译(这里不讲),配置linux的内核地址空间(0x4000_0000改为0x2000_0000),以及单核启动。CPU1设置为0x2000_0000~0x3FFF_FFFF(也可以小于0x3FFF_FFFF)如果禁用CPU1的L2 cache,在CPU1的bsp里面添加编译时候所需要的宏。3、配置工程,将vivado产生的.xsa文件复制到amp_com项目目录下。9、使用petalinux-package --boot 打包。一、vivado工程。5、编译u-boot。

y183128184的博客 1086

Shiro 之 基础 实战小项目

shiro 从基础到搭配 springboot

vihem的博客 417

PE启动盘结合360杀毒离线版:深度清除顽固病毒实战指南

在系统安全维护领域,离线查杀是一种在独立于宿主操作系统的环境下进行病毒扫描和清除的核心技术。其原理是通过一个预启动环境(如PE)加载杀毒软件,从而绕过可能已被感染或受保护的系统核心,直接访问和扫描磁盘文件。这项技术的核心价值在于能够彻底处理那些在正常系统运行时难以清除的深度隐藏病毒、Rootkit和驱动级木马。典型的应用场景包括应对勒索软件、顽固感染型病毒以及系统启动项被劫持等情况。本文以“PE启动盘”和“360杀毒离线版”这一经典组合为例,详细解析了从工具选型、环境部署到深度查杀策略的全流程,为系统维护人

weixin_29741447的博客 407

Activti工作流整合Springboot+Shiro权限管理项目实战教程

Activti工作流 第一章 工作流介绍 第一章示例代码见工程:code/act01 Activiti是一个项目的名称,Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任。 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的B...

jetty_welcome的博客 2901

基于激光雷达与视觉融合的四旋翼无人机室内避障方法研究

本文研究了一种基于激光雷达与视觉融合的四旋翼无人机室内避障方法。针对单一传感器在室内环境中的局限性,提出通过激光雷达提供精确几何距离、视觉相机补充语义信息的融合方案。研究内容包括:搭建ROS硬件平台集成单目相机与2D激光雷达;设计基于扩展卡尔曼滤波的传感器融合模型;改进VFH算法结合视觉深度图进行路径规划。实验验证表明,该方法在复杂室内环境下具有较高的鲁棒性、实时性与避障成功率,为解决无GPS信号环境下的无人机自主导航问题提供了有效方案。

huanghm88的专栏 347

全能媒体工具深度测评(下篇一):AI图文生成+全能解压+图片去文字,一键搞定素材精修

解压50多种格式,文生图,图生图

cs821984831的博客 40

shiro学习笔记:springboot整合shiro,并使用redis缓存

springboot单体应用,整合shiro,用来做权限管理,并加上redis缓存机制

zifengye520的专栏 5541

VMware Horizon 8 2111 部署系列(十一)准备RDS主机

RDS (Remote Desktop Service),即远程桌面服务。我们可以使用 Microsoft 远程桌面服务 (RDS) 提供 RDS 主机上的桌面会话并将应用程序传送给多个用户。

白昼的技术专栏 3468

Shiro会话管理及与SpringBoot整合

1、Shiro中的会话管理 在shiro里所有的用户的会话信息都会由Shiro来进行控制,shiro提供的会话可以用于JavaSE/JavaEE环境,不依赖于任何底层容器,可以独立使用,是完整的会话模块。通过Shiro的会话管理器(SessionManager)进行统一的会话管理。 1.1 什么是shiro的会话管理 SessionManager(会话管理器):管理所有Subject的sessio...

qqxhb 资源共享 556

[QMT量化交易小白入门]-105、震荡市最适合的策略:ETF多标的动态网格策略,回测年化收益47.81%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 2060

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringBoot整合SpringSecurity和Shiro

Shiro,SpringSecurity

390396010 3424

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Springboot+Shiro实战

Springboot+shiro 实战 1、Shiro概述(what) ​ Apache Shiro是一种功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理,可用于保护任何应用程序的安全- 从命令行应用程序,移动应用程序到最大的Web和企业应用程序。 1.1 功能概述 验证用户来核实他们的身份 对用户执行访问控制 判断用户是否被分配一个特定的角色 判定用户是否被允许做什...

天雨流芳 563

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

shiro整合springboot前后端分离

1、shiro配置package com.hisi.config; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.Filter; import org.apache.shiro.session.mgt.eis.MemorySessionDAO; import org.apache.shir...

有梦想的咸鱼的博客 1万+

玩转SpringBoot之整合 shiro 权限框架

在实际项目中,经常需要用到角色权限区分,以此来为不同的角色赋予不同的权利,分配不同的任务。比如,普通用户只能浏览;会员可以浏览和评论;超级会员可以浏览、评论和看视频课等;实际应用场景很多。毫不夸张的说,几乎每个完整的项目都会涉及到权限管理。 因此,这篇文章,阿淼就带大家将 shiro 权限框架整合到 SpringBoot 中,以达到快速的实现权限管理的功能。 序 在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是由于 Spring Security

Javaesandyou的博客 464

使用SpringBoot整合Shiro学习笔记

详情:https://gitee.com/hale459/SpringBoot-Shiro thymeleaf整合Shiro依赖 其他相关依赖 编写Shiro配置类 创建一个自定义的Realm 新建一个Shiro的配置类 Entity类 Controller类 Dao接口 Mapper.xml Service接口 Service接口实现 全局配置 logger jdbc 测试 登录不同的用户,对不同的用户设置不同的权限即可;......

何同学 326

SpringBoot从零整合轻量安全框架Shiro

Apache Shiro是一个简单、灵活且强大的Java安全框架,用于提供身份验证、授权、加密和会话管理等安全功能。它的设计理念是无侵入性,使得它可以轻松地与任何Java应用程序集成。Shiro提供了一系列内建的安全组件,如Subject(表示当前用户)、SecurityManager(管理所有安全操作)、Realm(与安全数据交互)等。通过这些组件,开发者可以快速实现用户身份验证、授权和会话管理。Shiro还提供了灵活的插件机制和可扩展的API,支持自定义功能和数据源集成。

Alaiks的博客 2860
上一篇: Shiro基础知识汇总
下一篇: 源码角度看待线程池的执行流程
杨树林_spring
博客等级 码龄5年 366粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值