springboot引入shiro实现拦截,权限,认证,授权功能

Shiro核心三大组件

1. Subject Subject表示与系统交互的对象,可以是登录系统的操作用户,也可能是另外一个软件系统。 Subject类图

2. SecurityManager SecurityManager是Shiro架构最核心的组件。实际上,SecurityManager就是Shiro框架的控制器,协调其他组件一起完成认证和授权

3. Realms Realm定义了访问数据的方式,用来连接不同的数据源,如:LDAP,关系数据库,配置文件等等。

Spingboot整合shiro

        <!--        shiro依赖-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.1</version>
        </dependency>

 自定义配置类(不懂的把spingboot自动配置原理搞清楚,类名为ShiroConfig,重写AuthorizingRealm类,用于用户的认证和授权

认证:用于判断登录,拦截之内的

授权:用于判断用户权限类型,显示相应的页面

package shiro.demo.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
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 sun.net.www.protocol.http.AuthCache;

import javax.swing.*;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author Vijay
 * @date 2020/3/29  -10:22
 */
@Configuration
public class ShiroConfig {
   //创建ShiroFilterFactoryBean  工厂bean
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager")DefaultWebSecurityManager getDefaultWebSecurityManager)
    {

        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //set
        bean.setSecurityManager(getDefaultWebSecurityManager);
        //bean的内置过滤器
    //        anon:无需认证就可以访问
   //        authc :必须要认证才能访问
   //        user:必须拥有记住我才有用
   //        perms:拥有某个资源的权限才能用
   //        role:拥有对某个角色的权限才能访问
        Map<String, String> map=new LinkedHashMap<>();
        //授权
        map.put("/user/add","perms[user:add]");
        map.put("/user/update","perms[user:update]");
        bean.setFilterChainDefinitionMap(map);
        bean.setLoginUrl("/toLogin");
        bean.setUnauthorizedUrl("/unauth");
        return  bean;
    }

    //创建DefaultWebSecurityManager   管理对象
    @Bean
   public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm)
   {
       DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
       //set
        securityManager.setRealm(userRealm);
       return securityManager;
   }
    //创建realm对象
    @Bean
    public UserRealm userRealm()
    {
        return new UserRealm();
    }

    //用ShiroDialect来整合 shiro和thymeleaf
    @Bean
    public ShiroDialect shiroDialect()
    {
        return  new ShiroDialect();
    }
}

  

package shiro.demo.config;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.catalina.security.SecurityUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import shiro.demo.entity.User;
import shiro.demo.service.UserService;

/**
 * @author Vijay
 * @date 2020/3/29  -10:42
 */
public class UserRealm  extends AuthorizingRealm {
    @Autowired
    private UserService userService;

   //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了认证操作");
        //连接数据库
        UsernamePasswordToken userToken= (UsernamePasswordToken) token;
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username",userToken.getUsername());
        User user = userService.getOne(wrapper);
       //用户名认证
        if (user==null) {
            return  null;
        }
        //密码认证
      return    new SimpleAuthenticationInfo(user,user.getPassword(),"");

    }
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了授权操作");
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //连接数据库,获取权限
        Subject subject = SecurityUtils.getSubject();
        User user = (User) subject.getPrincipal();
        info.addStringPermission(user.getPersm());
        return info;
    }

}

  根据打印台数据大概理解一下运行流

从realm对象到管理对象到工厂bean,从登录开始的话,没有登录的用户点击页面会转到登录页面,认证过会将数据存入subject里面,方便授权时候取数据

原文地址:https://www.cnblogs.com/420ITboy/p/12594665.html

时间: 2024-09-30 06:45:00

springboot引入shiro实现拦截,权限,认证,授权功能的相关文章

【Shiro】Apache Shiro架构之权限认证(Authorization)

上一篇博文总结了一下Shiro中的身份认证,本文主要来总结一下Shiro中的权限认证(Authorization)功能,即授权.如下: 本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authorization.html. 本文遵循以下流程:先介绍Shiro中的权限认证,再通过一个简单的实例来具体说明一下API的使用(基于maven). 1. 权限认证的核心要素 权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源.在权限认证中,最核心的三个要素

springboot动态修改日志级别+权限认证

1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个敏感操作,最好不能暴露地址直接修改,所以我研究了下,把权限验证加上了 1.2. 解决 1.2.1. pom 首先加上pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

作者:Sans_ juejin.im/post/5d087d605188256de9779e64 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shiro没有SpringSecurity功能更丰富,但是它轻量,简单,在项目中通常业务需求Shiro也都能胜任. 二.项目环境 MyBatis-Plus版本: 3.1.0 SpringBoot版本:2.1.5 JDK版本:1.8 Shiro版本:1.4 Shiro-redis插件版本:3.1.0 数据表(

跟我学Shiro实践-简单的认证授权

本文是基于张开涛老师的跟我学Shiro系列的个人实践.几个月前过了一遍张开涛的跟我学Shiro系列,因为没有实践,基本上又全部还给开涛老师了.趁着假期,这次准备将开涛老师的讲解实践一遍.当然本人的实践不会与开涛的实例完全相同,不然就没必要在写一遍了. 本文只会对相关必要的Shiro概念说明下,建议有时间可以阅读下开涛的Shiro系列:http://jinnianshilongnian.iteye.com/blog/2018398 Shiro的架构和简单的认证授权 1.1 Shiro架构和组件介绍

springboot,vue,shiro整合 关于登录认证功能

首先是session问题 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用户名和密码来进行认证.当浏览器第一次访问服务器(假设是登录接口),服务器验证用户名和密码之后,服务器会生成一个sessionid(只有第一次会生成,其它会使用同一个sessionid),并将该session和用户信息关联起来,然后将sessionid返回给浏览器,浏览器收到sessionid保存到C

使用springboot和redis实现redis权限认证

一.引言 登录权限控制是很多系统具备的功能,实现这一功能的方式有很多,其中使用token是现在用的比较多的 好处:可以防止CSRF攻击 二.功能实现: 用户登录成功后,后台生成一个token并存在redis中,同时给此用户的token设置时限,返回一个token给调用者,同时自定义一个@AuthToken注解,被该注解标注的API请求都需要进行token效验,效验通过才可以正常访问,实现接口级的鉴权控制.同时token具有生命周期,在用户持续一段时间不进行操作的话,token则会过期,用户一直操

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权

最新项目比较忙,写文章的精力就相对减少了,但看到邮箱里的几个催更,还是厚颜把剩下的文档补上. 一.修改ShiroDbRealm类,实现它的doGetAuthorizationInfo方法 package org.shiro.demo.service.realm; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.apache.commons.lang.St

Java秒杀系统实战系列~整合Shiro实现用户登录认证

摘要: 本篇博文是"Java秒杀系统实战系列文章"的第五篇,在本篇博文中,我们将整合权限认证-授权框架Shiro,实现用户的登陆认证功能,主要用于:要求用户在抢购商品或者秒杀商品时,限制用户进行登陆!并对于特定的url(比如抢购请求对应的url)进行过滤(即当用户访问指定的url时,需要要求用户进行登陆). 内容: 对于Shiro,相信各位小伙伴应该听说过,甚至应该也使用过!简单而言,它是一个很好用的用户身份认证.权限授权框架,可以实现用户登录认证,权限.资源授权.会话管理等功能,在本

【Shiro】Apache Shiro架构之身份认证(Authentication)

Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障.本文主要介绍一下Shiro中的身份认证功能,如下: 本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authentication.html. 本文遵循以下流程:先介绍Shiro中的身份认证,再通过一个实例来具体说明一下(基于maven). 1. 认证主体(Authenticating Subjects) Subject 认证主体包