Spring Security和Shiro的相同点与不同点整理

下面我将详细讲解“Spring Security和Shiro的相同点与不同点整理”,这里进行如下分类阐述:概念、使用场景、安全策略、授权与认证、拦截器等。

一、概念

  1. Spring Security:基于spring的安全框架,目的是为了给Java应用程序提供声明式的安全访问控制。
  2. Shiro:一个易于使用的Java安全框架,提供了身份验证、授权、密码和会话管理等功能。

其中,Spring Security被Spring官方所支持,而Shiro是由Apache所提供的。

二、使用场景

两者的使用场景有些相似。Spring Security可以为Web应用程序、REST API和方法级安全提供安全支持,而Shiro可以为Web应用程序、命令行脚本提供安全支持,但Shiro也可以用于企业应用程序的安全方面。

三、安全策略

  1. Spring Security支持基于角色的访问控制、基于IP的访问控制、基于表达式的访问控制、会话管理、并发控制等安全策略。
  2. Shiro支持基于角色的访问控制、基于权限的访问控制、基于SSL的安全、Session管理、登入和登出、密码重置等安全策略。

其中,两者都支持基于角色的访问控制。

四、授权与认证

  1. Spring Security有全套的认证和授权系统,支持多种认证方式(表单认证、基于LDAP和CAS单点登录等)、多种授权方式(JSR-250、自定义授权等)等。
  2. Shiro也有全套的认证和授权系统,支持多种认证方式(首选的是基于类似于Spring Security的过滤器链的类似API成员的JavaBean组件或基于Servlet的集成)。多种授权方式(Role、Permission包括新的WildcardPermission、Advanced WildcardPermission和BitPermission等)等。

五、拦截器

两者都使用了拦截器来解决特定的安全问题并保护应用程序不受攻击。

使用Spring Security时,我们可以使用过滤器、处理器拦截器、资源拦截器和bean定义拦截器等Spring框架的特性实现拦截。具体实现时可以通过编写配置类、使用注解等方式进行配置。

使用Shiro时,调用org.apache.shiro.web.filter.mgt.DefaultFilterChainManager.registerFilter和org.apache.shiro.web.filter.mgt.DefaultFilter将一个过滤器添加/注册到Shiro Filter链中。

示例1:Spring Security的配置

首先,我们需要添加Spring Security的Maven依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring.version}</version>
</dependency>

然后,我们可以编写一个配置类来实现Spring Security的配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

示例2:Shiro的配置

我们需要添加以下Shiro依赖:

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

然后,我们可以编写一个Shiro配置类:


@Configuration
public class ShiroConfig {

    private static final String NAME = "admin";
    private static final String PASSWORD = "1234";

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm());
        return securityManager;
    }

    @Bean
    public Realm realm() {
        return new SimpleAccountRealm() {
            @Override
            protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
                UsernamePasswordToken uToken = (UsernamePasswordToken) token;
                if (!NAME.equals(uToken.getUsername())) {
                    throw new UnknownAccountException("user not exist!");
                }
                return new SimpleAuthenticationInfo(NAME, PASSWORD, getName());
            }

            @Override
            protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
                SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
                info.addStringPermission("user:read");
                return info;
            }
        };
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean<DelegatingFilterProxy> bean = new FilterRegistrationBean<>();
        DelegatingFilterProxy proxy = new DelegatingFilterProxy();
        proxy.setTargetFilterLifecycle(true);
        proxy.setTargetBeanName("shiroFilter");
        bean.setFilter(proxy);
        bean.addUrlPatterns("/*");
        return bean;
    }

    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager());
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login.jsp", "anon");
        filterChainDefinitionMap.put("/doLogin", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return factoryBean;
    }
}

以上就是Spring Security和Shiro的相同点与不同点整理和示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security和Shiro的相同点与不同点整理 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java8 如何正确高效的使用并行流

    Java8 如何正确高效的使用并行流 什么是并行流 在 Java8 中,我们可以使用 Stream API 提供的 parallel() 方法来创建并行流,将一个大任务划分成多个小任务并行执行。 如何使用并行流 小心使用 并行流虽然可以大大提高执行效率,但是在使用时需要小心,因为它并不是万能的,有时候反而会降低效率。以下是一些使用并行流时需要注意的点: 并行…

    Java 2023年5月18日
    00
  • C#编程自学之开篇介绍

    C#编程自学之开篇介绍 本文将为大家介绍如何通过自学的方式学习C#编程语言。C#是一种面向对象的程序设计语言,它主要用于开发Windows桌面应用程序、Web应用程序、游戏、移动应用程序等应用领域。相信大家在学习C#编程过程中会遇到各种各样的问题,如何处理这些问题是自学过程中最关键的一点。 确定学习C#编程的目的和方向 在开始自学之前,首先需要明确自己想要学…

    Java 2023年5月23日
    00
  • SpringAOP 构造注入的实现步骤

    Spring AOP中的“构造注入”是一种依赖注入的方式。它通过将一个切面对象构造函数的参数注入目标对象来实现。下面是Spring AOP中构造注入的实现步骤: 定义切面类,该类必须实现一个切面接口。其中至少有一个构造函数,并将目标对象作为参数。例如: public class SecurityAspect implements Aspect { priva…

    Java 2023年5月19日
    00
  • java类中使用Jfreechart的简单实例

    下面是使用JFreeChart库在Java类中绘制图表的完整攻略。 准备工作 在开始使用JFreeChart之前,我们需要先将其添加到我们的工程中。可以通过以下步骤完成: 下载JFreeChart库的jar包,可以从官方网站 www.jfree.org 上获得。 将下载的jar包拷贝到工程的lib目录下。 在Eclipse中添加JFreeChart库到Jav…

    Java 2023年6月16日
    00
  • 浅谈Java代码的 微信长链转短链接口使用 post 请求封装Json(实例)

    这里给出详细的攻略。 1. 背景介绍 微信公众号开发中,经常会使用到微信接口进行开发,其中短链接转化也是很常见的操作。本篇文章主要介绍如何使用 Java 代码封装微信长链接转短链接接口,使用 post 请求,并将返回结果封装为 JSON 数据。 2. 实现步骤 2.1. 导入相关 jar 包 使用 HttpClient 可以方便地发送 post 请求,并获取…

    Java 2023年5月26日
    00
  • SpringBoot处理JSON数据方法详解

    下面就是关于“SpringBoot处理JSON数据方法详解”的完整攻略。 1.概述 在SpringBoot中,我们通常需要使用JSON来传递数据,处理JSON数据是非常常见的操作。 SpringBoot提供了多种方式来处理JSON数据,包括: 使用SpringMVC默认的jackson插件 使用GSON插件 使用FastJson插件 这三种方式中,Sprin…

    Java 2023年5月20日
    00
  • java9新特性Reactive Stream响应式编程 API

    Java 9 增加了 Reactive Stream 响应式编程 API,使得开发者能够更方便地实现响应式编程。本文将详细解释 Reactive Stream API 的用法,并提供示例代码来说明。 Reactive Stream 简介 Reactive Stream 是一种用于异步编程的编程模型,它能够处理大数据流和异步操作。Reactive Stream…

    Java 2023年5月26日
    00
  • Centos7.3下Tomcat8的安装配置教程

    好的!下面是 “Centos7.3下Tomcat8的安装配置教程” 的完整攻略: 安装JDK8 在Centos7.3系统下,使用以下命令安装JDK8: yum install java-1.8.0-openjdk-devel 验证JDK8是否成功安装: java -version 安装Tomcat8 下载Tomcat8的压缩包: wget https://m…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部