Java中的认证与授权:从Shiro到Spring Security的实现对比

Spring Security 和Shiro对比 Spring Security 的前身是 Acegi Security,在被收纳为Spring子项目后正式更名为Spring Security。Spring Security是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富;Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准; 阅读详情

Java中的认证与授权:从Shiro到Spring Security的实现对比

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,安全性是一个不可忽视的方面。认证(Authentication)和授权(Authorization)是确保应用安全的两个核心环节。Apache Shiro和Spring Security是两个流行的安全框架,各自提供了不同的认证和授权解决方案。本文将对这两个框架进行详细的对比,展示它们在实际应用中的实现方式和特点。

1. Shiro概述

Apache Shiro是一个功能强大的Java安全框架,提供了全面的认证、授权、加密和会话管理功能。Shiro的设计目标是简化安全开发,它通过简单的API和配置方式来实现这些功能。

1.1 Shiro的基本配置

首先,你需要在项目中添加Shiro的依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>2.0.0</version>
</dependency>

接下来,配置Shiro的shiro.ini文件:

[users]
# username=password,role1,role2
admin=admin123,admin

[roles]
# role=permission
admin=*

[urls]
/login = anon
/** = authc

然后,定义Shiro的SecurityManager和Realm:

package cn.juwatech.security;

import org.apache.shiro.realm.Realm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.annotation.RequiresRoles;

public class ShiroExample {
    public static void main(String[] args) {
        Realm realm = new MyRealm(); // 自定义的Realm
        DefaultSecurityManager securityManager = new DefaultSecurityManager(realm);
        SecurityUtils.setSecurityManager(securityManager);

        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin123");

        try {
            subject.login(token);
            subject.checkRole("admin");
            System.out.println("Authentication and authorization successful.");
        } catch (AuthorizationException e) {
            System.out.println("Authorization failed: " + e.getMessage());
        }
    }
}

1.2 自定义Realm

自定义Realm实现认证和授权逻辑:

package cn.juwatech.security;

import org.apache.shiro.authc.Authenticator;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.authc.SimpleAuthenticationInfo;

public class MyRealm implements Realm {

    @Override
    public String getName() {
        return "myRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        String password = new String((char[]) token.getCredentials());
        
        if ("admin".equals(username) && "admin123".equals(password)) {
            return new SimpleAuthenticationInfo(username, password, getName());
        } else {
            throw new AuthenticationException("Invalid username or password.");
        }
    }
}

2. Spring Security概述

Spring Security是一个功能强大且高度可配置的安全框架,广泛用于保护Java应用程序的安全。Spring Security集成了认证和授权机制,并且与Spring生态系统有着良好的兼容性。

2.1 Spring Security的基本配置

首先,你需要在项目中添加Spring Security的依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>5.8.1</version>
</dependency>

接下来,配置Spring Security的Java配置类:

package cn.juwatech.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("admin")
                .password("{noop}admin123")
                .roles("ADMIN");
    }
}

2.2 实现自定义用户详情

如果你需要从数据库或其他来源获取用户信息,可以实现UserDetailsService接口:

package cn.juwatech.security;

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if ("admin".equals(username)) {
            return User.withUsername("admin")
                       .password("{noop}admin123")
                       .roles("ADMIN")
                       .build();
        } else {
            throw new UsernameNotFoundException("User not found.");
        }
    }
}

3. Shiro与Spring Security的比较

3.1 配置方式

  • Shiro:通过配置文件或Java代码进行配置,支持灵活的安全管理,但可能需要额外的配置工作。
  • Spring Security:通过Java配置类进行配置,与Spring框架集成紧密,支持更为详细的安全配置。

3.2 性能

  • Shiro:较为轻量级,适合小型应用和灵活配置需求的场景。
  • Spring Security:功能全面,但由于其复杂性,可能在配置不当时导致性能问题。适合大型和复杂的应用场景。

3.3 易用性

  • Shiro:API简洁,易于上手,适合需要快速实现安全功能的场景。
  • Spring Security:提供了更多的功能和配置选项,适合需要高度定制化和与Spring集成的应用。

4. 实践中的最佳做法

4.1 对于Shiro

  • 配置简单:适合快速开发和小型项目,使用内存认证和简单的配置。
  • 定制化:对于需要复杂权限控制的项目,建议使用自定义Realm和扩展功能。

4.2 对于Spring Security

  • 利用Spring集成:利用Spring生态系统的功能,集成Spring Boot和Spring Data等组件,提升开发效率。
  • 详细配置:根据应用需求进行详细的安全配置和自定义实现,确保安全性和灵活性。

总结

在Java应用中实现认证和授权功能时,Shiro和Spring Security是两个强大的选择。Shiro提供了简单易用的API,适合小型项目和快速开发,而Spring Security则提供了全面的安全功能和与Spring的深度集成,适合复杂和大型应用。根据项目的需求和复杂度选择合适的框架,将有助于实现高效且安全的应用程序。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

Spring Security与Shiro的比较 Spring Security还提供了与Spring的许多其他功能和扩展点的集成,例如使用Spring的表达式语言进行授权决策。Spring Security和Shiro都是Java领域中常用的安全框架,用于保护应用程序的安全性和控制用户访问权限。Shiro则是一个独立的安全框架,不依赖于特定的框架。综上所述,Spring Security和Shiro都是优秀的Java安全框架,具有各自的特点和优势。Spring Security是一个非常成熟和广泛应用的安全框架,拥有庞大的开发者社区和丰富的文档资源。 阅读详情

相关推荐

ZYNQ RFSoC 的DAC如何做到从 0到Fs频段 信号输出

之前一直没太了解 RFSoC 的DAC如何输出在 Fs/2 到 Fs 频率范围内的信号,例如 ZCU216中的 ZU49DR,其RF-DAC最大采样率是 9.85GSPS,如果想输出的信号中心频率在5.8G,它是如何有效输出在第二奈奎斯特区域范围的信号的。

weixin_44630490的博客 1551

spring security、shiro

spring security介绍定义:为基于spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架,实现了认证和授权,提供了基于账号和密码的认证,通过安全配置实现请求拦截、授权。但不仅仅是这些认证spring security默认提供认证界面,无需额外开发安全配置:spring security提供了用户名密码登录、退出、会话认证等功能,只需配置即可。自定义类继承WebSecurityConfigurerAdapter,使用@EnableWebSecurity注解修饰。

qq_48501521的博客 1757

TP4056锂电池充电电路设计原理与工程实践

锂离子电池充电管理是嵌入式电源系统的核心基础技术,其本质是通过恒流恒压(CC/CV)控制策略,匹配电池电化学特性以实现安全、高效、长寿命充放电。TP4056作为典型线性充电IC,以精简外围实现预充、恒流、恒压及自动截止全周期管理,但受限于线性拓扑的热耗散特性,必须协同散热设计、电阻精度选型与PCB布局进行系统级优化。该方案广泛应用于STM32智能小车、便携传感器节点等3.7V单节锂电供电场景,兼顾成本、可靠性与工程可实施性,是入门嵌入式硬件电源设计的关键实践范例。

weixin_36064575的博客 219

认证鉴权之Spring Security与Shiro

Spring Security 是一个基于 Spring 框架的安全框架,它提供了全面的安全性支持,包括身份认证、授权、攻击防范和安全通信等功能。强大的身份认证和授权功能:Spring Security 提供了灵活的身份认证和授权机制,支持多种身份认证方式和授权策略,可以根据应用程序的需求进行定制。可扩展性和灵活性:Spring Security 提供了许多可扩展的 API 和插件,可以方便地对其进行定制和扩展,以适应应用程序的需求。它还支持密码加密和解密的支持,可以保护用户密码的安全性。

lonely_baby的博客 445

对话系统简介

《文本上的算法》学习笔记1、问答型1.1、基于语义分析的方法1.2、基于信息抽取的方法1.3、端对端的方法2、任务型2.1、生成式模型( Generative Model )2.2、判别式模型( Discrimitive Model )2.3、规则系统3、闲聊型3.1、规则方法3.2、生成模型3.3、检索方法 个人认为NLP领域最难的方向可以说是阅读理解与文本生成/摘要,而对话系统,尤其是闲聊常常...

盘一哈nlp 6750

别再到处找包了!Keil5芯片支持包(Pack)最全管理指南:安装、更新、迁移与离线备份

本文详细解析了Keil5芯片支持包(Pack)的全生命周期管理,包括安装、更新、迁移与离线备份的工程化解决方案。针对STM32F10x等常见芯片,提供了高效获取Pack的策略、版本管理技巧及团队协作方案,帮助开发者解决常见的'Device Family Pack missing'等问题,提升嵌入式开发效率。

weixin_28729205的博客 539

对比整合shiro和springsecurity(springboot项目):授权资源和认证登录

springboot整合shiro授权资源和认证登录 一、在pom.xml文件里添加shiro依赖 <!--shiro-spring依赖--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId&g...

furenqiang的博客 1541

kali破解wifi之airmon-ng 工具利用

......

qq_42378173的博客 1万+

SpringBoot 安全框架二选一:SpringSecurity vs Shiro 深度对比

而在 Spring Boot 项目中,选择合适的安全框架来保障应用的安全性是开发者常常面临的问题。Spring Security 和 Apache Shiro 是两个备受关注的安全框架,它们都可以为 Spring Boot 应用提供安全防护。本文将对这两个框架进行深度对比,帮助技术人员根据项目需求做出更合适的选择。

梵心白莲的博客 1192

STM32多模式智能小车状态机设计与中断优先级实践

在嵌入式实时系统中,状态机是实现多任务协同与功能切换的核心范式。其本质是通过有限状态集合、明确转移条件和确定性动作,构建可预测、易维护的控制逻辑。基于STM32等资源受限MCU时,需兼顾状态调度效率、中断并发安全与硬件资源约束。关键技术价值体现在:提升系统模块解耦度、支持物理按键与蓝牙双源触发、保障实时响应不丢帧。典型应用场景包括智能小车多模运行(循迹、避障、遥控、定距跟随等)、工业设备工作模式切换及IoT终端低功耗状态管理。本文以STM32F103C8T6平台为例,深入解析全局模式变量设计、双通道状态切换

weixin_42509888的博客 92

从数据读取到业务事件:理解 ABAP CDS 视图的目的与选型(含 RAP、扩展与分析场景)

CDS视图在SAP S/4HANA中不仅是数据查询工具,更是语义模型和运行时能力的载体。它通过分层架构(基础视图、组合视图、消费视图等)实现数据复用与场景适配,支持UI、分析、事务处理等多样化消费。视图类型包括提供数据访问的接口视图(I_前缀)、消费视图(C_前缀)和事务视图,以及不提供数据访问的扩展视图。这种分层设计确保了数据模型的稳定性与扩展性,同时支持自定义字段和上下文感知分析。正确理解CDS视图的用途和分层规则,能帮助开发者构建更健壮、可维护的SAP应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 301

SpringSecurity和Shiro---权限设置

安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境地:一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用户的隐私数据被攻击者窃取;Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!

JEREMY的博客 1151

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1883

Spring Security认证与授权

Spring Security是基于Spring框架,提供了一套Web应用安全性框架.专门为Java应用提供用户认证(Authentication)和用户授权(Authorization),支持单体应用到微服务的全场景安全防护首先要重写中的方法,可以自己写使用@Bean注册,也可以重写接口的方法由于Spring Security会对每一个接口都会进行认证,有些接口需要放行,直接让用户访问,我们就得在config()中进行放行接着需要把注入容器→因为要使用其的authenticate方法进行验证/**

weixin_40605005的博客 158

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SpringBoot项目中的安全框架Shiro和Spring Security—认证、授权等

Shiro Spring Security 异步任务,邮件发送,定时任务 Swagger Dubbo+Zookeeper

sormous的博客 853

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring Security 和 Shiro 该如何选择?

推荐:【全网最热权限管理框架】Spring Security核心工作原理分析,深度解读SpringSecurity在分布式架构中的作用 要知道Shiro和Spring Security该如何选择,首先要看看两者的区别和对比 Shiro Apache Shiro是一个强大且易用的Java安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。使用Shiro的易于理解的API,您可以...

罗翔 127

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Shiro

Shiro 1.1简介 Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。 本教程只介绍基本的 Shiro 使用,不会过多分析源码等,重在使用。 Shiro 可以非常容易的开发出足够好的应用,其

Pig-pig-pig的博客 341
上一篇: Java后端中的Schema管理:Liquibase与Flyway的对比与应用
下一篇: Java后端开发中的依赖循环问题:如何识别与解决
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值