shiro:初识shiro及简单尝试(代码片段)

it-taosir it-taosir     2023-01-20     316

关键词:

Shiro

一、什么是Shiro

  Apache Shiro是Java的一个安全(权限)框架

  作用:认证、授权、加密、会话管理、与web集成、缓存等

  下载地址:http://shiro.apache.org/download.html

二、Shiro的架构

  1)subject:可以与应用交互的“用户”

  2)SecurityManager:相当于SpringMVC中的DispatcherServlet;是Spring的心脏,交互都由其控制。管理所有的subject且负责进行认证、授权、会话及缓存的管理。

  3)Authenticator:负责subject认证,是一个扩展点,可自定义实现;可以使用认证策略(Authentication Strategy)即什么情况下算用户通过了认证。

  4)Authorizer:授权器。决定是否有权限进行相应的操作。控制用户可以访问的有哪些

  5)Realm:可以有一个或者多个,可以认为是安全实体数据源,即用于获取安全实体的,可以是JDBC实现,也可以是内存实现等等,由用户提供。

  6)SessionManager:管理Session生命周期的组件。而Shiro并不仅仅可以在Webh环境,也可以用在普通的JavaSE环境

  7)CacheManager:缓存控制器,用来管理如用户、角色、权限等的缓存

  8)Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密

三、谈谈一些关键的位置

这里以结合springboot与mybatis的代码为例

技术分享图片
        <!-- shiro与spring整合的依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>$shiro.version</version>
        </dependency>
        <!-- ali的数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>$druid.version</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- springboot的mybatis启动器 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>$mybatis.version</version>
        </dependency>
    </dependencies>
<!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>$fastjson.version</version>
        </dependency>
        <!-- springboot的web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
相关依赖
package cn.zytao.taosir.user.config;

import java.util.LinkedHashMap;
import java.util.Map;

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;

/**
 * Shiro的配置类
 * @author taosir
 */
@Configuration
public class ShiroConfig 

    /**
     * 创建Realm
     */
    @Bean(name="userRealm")
    public UserRealm getRealm() 
        return new UserRealm();
    
    
    /**
     * 创建DefaultWebSecurityManager
     * @param userRealm
     */
    @Bean(name="securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) 
        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        //关联realm
        securityManager.setRealm(userRealm);
        return securityManager;
    
    
    /**
     * 创建ShiroFilterFactoryBean
     */
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) 
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        
        //添加Shiro内置过滤器
        /**
         * Shiro内置过滤器,可以实现权限相关的拦截器
         * 常用的过滤器:
         *     anon:无需认证(登录)可以访问
         *     authc:必须认证才可以访问
         *  user:如果使用rememberMe的功能可以直接访问
         *  perms:该资源必须得到资源权限才可以访问
         *  role:该资源必须得到角色权限才可以访问
         */    
        Map<String, String> filterMap= new LinkedHashMap<String,String>();
        
        
        //修改拦截后跳转的请求路径
        shiroFilterFactoryBean.setLoginUrl("/user/badRequest");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    
    
package cn.zytao.taosir.user.config;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import cn.zytao.taosir.common.model.user.User;
import cn.zytao.taosir.user.mapper.UserMapper;

/**
 * 自定义的Realm程序
 * @author taosir
 */
public class UserRealm extends AuthorizingRealm
        
    @Autowired
    private UserMapper userMapper;
    
    /**
     * 执行授权逻辑
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) 
        System.out.println("开始执行Shiro的授权方法...");
        return null;
    

    /**
     * 执行认证逻辑
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException 
        System.out.println("开始执行Shiro的认证方法...");        
        //编写Shiro判断逻辑,判断用户名和密码
        //判断用户名是否存在
        UsernamePasswordToken token=(UsernamePasswordToken)arg0;
        User user = userMapper.findByUsername(token.getUsername());
        if(user==null)
            return null;
        //判断密码是否正确
        return new SimpleAuthenticationInfo("",user.getPassword(),"");
    

主要就是这两个相关类的关联,代码为我的实现,注解已经说明了相关位置写什么内容

记得配上mybatis的配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/taosir-user?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
mybatis:
  type-aliases-package: cn.zytao.taosir.common.model.user

 

package cn.zytao.taosir.user.service.impl;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Service;

import cn.zytao.taosir.common.exception.BadRequestException;
import cn.zytao.taosir.user.service.UserService;

@Service
public class UserServiceImpl implements UserService
    
    @Override
    public void checkLogin(String username,String password) 
        /**
         * 使用Shiro编写认证操作
         */
        //获取Subject
        Subject subject=SecurityUtils.getSubject();
        //封装用户数据
        UsernamePasswordToken token=new UsernamePasswordToken(username,password);
        //执行登录方法
        try 
            subject.login(token);
         catch (UnknownAccountException e) 
            //用户名不存在
            throw new BadRequestException("该用户名不存在");
         catch (IncorrectCredentialsException e) 
            //密码错误
            throw new BadRequestException("密码不正确");
         catch (Exception e) 
            throw new BadRequestException("由于未知错误登录失败,请联系管理员或稍后重试");
        
    

 

shiro学习总结----初识shiro(代码片段)

 本系列内容大多总结自官网和张开涛的《跟我学Shiro》 一、shiro简介  1.1、shiro有什么用?    shiro是一个功能强大使用简单的java安全框架,主要提供了五大功能:    1、认证:用户身份认证,也就是登陆;... 查看详情

shiro(代码片段)

...认证,授权,加密及会话管理的解决方案。ApacheShiro相当简单,对比SpringSecurity,可能没有SpringSecurity做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,能更简单的解决项目问题就好了。Shiro不仅可以用在JavaSE环境... 查看详情

⭐图例结合超硬核讲解shiro⭐(代码片段)

shiro目录前言一、shiro简介二、shiro简单使用三、身份验证3.1.环境准备3.2.登录/退出四、shiro授权4.1.shiro授权的三种方式:4.2.实现4.3.自定义Realm进行授权五、与SpringBoot集成案例六、shiro各个拦截器对比及使用配置6.1.各种拦截器的特... 查看详情

springboot学习shiro快速入门及与springboot集成(代码片段)

目录1、Shiro简介1.1、Shiro是什么?1.2、有哪些功能?1.3、Shiro架构(外部)1.4、Shiro架构(内部)2、HelloWorld2.1、快速实践3、SpringBoot集成3.1、SpringBoot整合Shiro环境搭建3.2、Shiro实现登录拦截3.3、Shiro实现用户认证3.4、Shiro整合Mybati... 查看详情

shiro框架学习-6-shiro内置的filter过滤器及数据加解密(代码片段)

1. shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个,配置哪个路径对应哪个拦截器进行处理////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernflowerdecompiler)//packageorg.apache.shiro.web.filter.mgt;importjava.util.LinkedHashMap;im... 查看详情

shiro的简单介绍(代码片段)

1.Shiro的简单配置1)获取ShiroFilterFactoryBean,作用是在执行相关操作前,先进行功能过滤,拦截所有请求,进入到shiro中进行认证与授权例如:设置一些拦截的请求//身份认证失败,则跳转到登录页面的配... 查看详情

shiro浅析:shiro的登录验证过程(代码片段)

对Shiro的验证过程进行简单的分析Shiro浅析:Shiro的登录验证过程shiro的登录验证是从Subject.login开始的Subjectsubject=SecurityUtils.getSubject();UsernamePasswordTokentoken=newUsernamePassword(username,password[,remenberme]);subject.login 查看详情

权限控制框架shiro简单介绍及配置实例

Shiro是什么ApacheShiro是一个非常易用的Java安全框架它能提供验证、授权、加密和Session控制。Shiro非常轻量级而且API也非常易于理解可以使用Shiro完成从APP到企业级应用的所有权限控制。宏观视图从宏观来看Shiro架构中有3个重要概... 查看详情

2shiro的认证(代码片段)

...iro的同学看到上面的图片也不明白,下面我们来在代码中尝试体验Shiro的认证过程:1.新建一个SpringBoot项目项目结构如下:ShiroframeApplicationTests代码:packagecom.shiro.shiroframe;importorg.apache.shiro.SecurityUtils;importor 查看详情

shiro系列:简单示例学习(代码片段)

在本示例中,使用INI文件来定义用户和角色.首先学习一下INI文件的规范.  =======================ShiroINI的基本规范=======================[main]#在这里定义SecurityManager和Realms等[users]#每一行定义一个用户,格式是username=password,role1,role2,..... 查看详情

初识shiro

转载地址https://my.oschina.net/Tsher2015/blog/654993摘要:核心JAR包:shiro-core.jar1.shiro流程:1.1.使用数据源,也就是RealM初始化SecurityManagerFactory.1.2.得到SecurityManager(安全管理器).1.3.设置到SecutiryUtils.1.4.得到subject,使用认证服务.2.权 查看详情

shiro之realm及相关对象principalcollection(代码片段)

之前使用过的(来点印象)login("classpath:shiro-authenticator-all-success.ini");Subjectsubject=SecurityUtils.getSubject();//得到一个身份集合,其包含了Realm验证成功的身份信息PrincipalCollectionprincipalCollection=subject.getPrincipals();... 查看详情

003shiro的认证(代码片段)

一.概述  认证:简单说就是登录,用户携带账号和密码信息通过Subject对象与shiro进行交互,看用户的身份凭证是否正确.  本节需要演示认证的流程. 二.搭建环境  本次使用ini充当Realm对象,使用IniSecurityManager充当SecurityManage... 查看详情

shiro学习——shiro与web集成(代码片段)

...用的关键。这里以最基础的与servlet集成作为例子。新建简单的servlet应用这里以《Eclipse新建基于Servlet3.x的maven项目》这篇文章的方式构建基本的servlet,就不在本文叙述了。Servlet与Shiro集成在web.xml配置 查看详情

shiro学习——shiro与web集成(代码片段)

...用的关键。这里以最基础的与servlet集成作为例子。新建简单的servlet应用这里以《Eclipse新建基于Servlet3.x的maven项目》这篇文章的方式构建基本的servlet,就不在本文叙述了。Servlet与Shiro集成在web.xml配置 查看详情

shiro的简单介绍(代码片段)

1.Shiro的简单配置1)获取ShiroFilterFactoryBean,作用是在执行相关操作前,先进行功能过滤,拦截所有请求,进入到shiro中进行认证与授权例如:设置一些拦截的请求//身份认证失败,则跳转到登录页面的配... 查看详情

shiro之realm及相关对象authorizationinfo(代码片段)

AuthorizationInfo用于聚合授权信息的:publicinterfaceAuthorizationInfoextendsSerializable Collection<String>getRoles();//获取角色字符串信息 Collection<String>getStringPermissions();//获取权限字符串信息 Collection<Permission>getObjectPermissions();//... 查看详情

springboot整合shiro+jwt实现认证及权限校验(代码片段)

序言本文讲解如何使用SpringBoot整合Shiro框架来实现认证及权限校验,但如今的互联网已经成为前后端分离的时代,所以本文在使用SpringBoot整合Shiro框架的时候会联合JWT一起搭配使用。ShiroShiro是apache旗下一个开源框架,... 查看详情