栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot 整合 Shiro 快速入门教程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot 整合 Shiro 快速入门教程

0. Gitee项目地址

XINGLIBAO / springboot-shiro

1. Shiro简介

Apache Shiro是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。

Apache Shiro | Simple. Java. Security.

2. Shiro核心组件
  • UsernamePasswordToken:

    Shiro 用来封装用户登录信息,使用用户的登录信息来创建令牌 Token

  • SecurityManager:

    Shiro 的核心部分,负责安全认证和授权

  • Subject:

    Shiro 的一个抽象概念,包含了用户信息

  • Realm:

    开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在 Realm 中

  • AuthenticationInfo:

    用户的角色信息集合,认证时使用

  • AuthorzationInfo:

    角色的权限信息集合,授权时使用

  • DefaultWebSecurityManager:

    安全管理器,开发者自定义的 Realm 需要注入到 DefaultWebSecurityManager 进行管理才能生效

  • ShiroFilterFactoryBean:

    过滤器工厂,Shiro 的基本运行机制是开发者定制规则,Shiro 去执行,具体的执行操作就是由 ShiroFilterFactoryBean 创建的一个个 Filter 对象来完成

3. Shiro运行机制

4. SpringBoot 整合 Shiro

(1) 创建 SpringBoot 应用,集成 Shiro 等相关组件


    org.apache.shiro
    shiro-spring
    1.5.3

(2) 自定义 Shiro 过滤器

package com.lichun.realm;

import com.lichun.entity.Account;
import com.lichun.service.AccountService;
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 java.util.HashSet;
import java.util.Set;


public class AccountRealm extends AuthorizingRealm {

    @Autowired
    private AccountService accountService;

    
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        // 获取当前用户的登录信息
        Subject subject = SecurityUtils.getSubject();
        Account account = (Account) subject.getPrincipal();

        // 设置角色
        Set roles = new HashSet<>();
        roles.add(account.getRole());
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);

        // 设置权限
        info.addStringPermission(account.getPerms());
        return info;
    }

    
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        Account account = accountService.findByUsername(token.getUsername());
        if (account != null) {
            
            return new SimpleAuthenticationInfo(account, account.getPassword(), getName());
        }
        return null;
    }
}

(3) 配置类

package com.lichun.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.lichun.realm.AccountRealm;
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.Hashtable;
import java.util.Map;


@Configuration
public class ShiroConfig {

    
    @Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean
            (@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        // 编写认证和授权规则
        Map map = new Hashtable<>();
        
        map.put("/main", "authc");
        
        map.put("/manage","perms[manage]");
        
        map.put("/administrator","roles[administrator]");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);

        // 设置登录页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 设置未授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauth");

        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager
            (@Qualifier("accountRealm") AccountRealm accountRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(accountRealm);
        return securityManager;
    }

    @Bean
    public AccountRealm accountRealm() {
        return new AccountRealm();
    }
}

(4) 编写认证和授权规则

认证过滤器

  • anon:无需认证
  • authc:必须认证
  • authcBasic:需要通过 HTTPBasic 认证
  • user:不一定通过认证,只要曾经被 Shiro 记录即可,比如:记住我。

授权过滤器

  • perms:必须拥有某个权限才能访问
  • role:必须拥有某个角色才能访问
  • port:请求的端口必须是指定值才可以
  • rest:请求必须基于 RESTful,POST、PUT、GET、DELETE
  • ssl:必须是安全的 URL 请求,协议 HTTPS
5. Shiro 整合 Tymeleaf

(1) 引入依赖


    com.github.theborakompanioni
    thymeleaf-extras-shiro
    2.0.0

(2 )配置类添加 ShiroDialect

@Bean
public ShiroDialect shiroDialect() {
    return new ShiroDialect();
}

(3) index.html




    
    index
    
    
    



    

index

main
6. account表

7. B站学习地址

【硬核干货】2小时学会Spring Boot整合Shiro

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号