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日

相关文章

  • Mybatis如何自动生成数据库表的实体类

    要让Mybatis自动生成数据库表的实体类,需要使用Mybatis Generator这个工具。 下面是使用Mybatis Generator自动生成实体类的详细步骤: 配置generatorConfig.xml文件 在generatorConfig.xml文件中,需要指定要生成的实体类所在的包名、数据库连接信息、要生成的表名等。下面是一个示例配置: &lt…

    Java 2023年5月20日
    00
  • 如何使用动态字节码生成框架?

    使用动态字节码生成框架可以通过编写Java代码来动态生成字节码,从而在运行时生成类并加载。它可以用于动态地创建类、修改和替换类方法、篡改类的属性等场景。常用的动态字节码生成框架包括ASM、Javassist、ByteBuddy等。 以下是使用ASM和Javassist两个框架的使用攻略: 使用ASM生成动态字节码 步骤一:创建一个ClassWriter实例 …

    Java 2023年5月11日
    00
  • springboot 按月分表的实现方式

    使用SpringBoot分库分表组件的时候,要实现按月分表就需要按照下面的步骤进行配置。 步骤一:配置yml或properties文件 首先,我们需要在配置文件中设置分表相关的属性,例如: spring: sharding: tables: student: actual-data-nodes: ds$->{0..1}.student$->{20…

    Java 2023年6月3日
    00
  • Java中Map与JSON数据之间的互相转化

    Java中Map与JSON数据之间的转化是Java开发中常见的操作,特别是在进行前后端数据交互的过程中。下面是Java中Map与JSON数据之间互相转化的完整攻略。 1. Map转JSON 将Map转化为JSON格式的数据可以使用Gson、Jackson等第三方库进行实现。 1.1 Gson实现 Gson是Google提供的一个Java中的JSON处理库,可…

    Java 2023年5月26日
    00
  • java单元测试JUnit框架原理与用法实例教程

    首先我们需要了解JUnit框架的原理和用法。JUnit是Java语言中最流行的单元测试框架之一,使用JUnit框架可以对Java应用程序进行单元测试。 一、JUnit框架原理 JUnit框架的原理主要是基于Java反射机制实现的。JUnit框架通过反射机制来查找待测试类中的测试方法,并按照一定的顺序执行测试方法,然后针对每一个测试方法进行断言,判断测试结果是…

    Java 2023年6月15日
    00
  • SpringSecurity+JWT实现前后端分离的使用详解

    实现前后端分离的一个重要问题是如何进行身份验证和授权。Spring Security提供了一个非常方便的方法来处理这个问题,即使用JSON Web Token(JWT)。 JWT是一种用于身份验证和授权的开放标准,它定义了一种紧凑的、自包含的、可自校验的JSON格式来传递信息,通常用于在安全领域的传输而被广泛使用。 下面是SpringSecurity+JWT…

    Java 2023年5月20日
    00
  • Java如何提供给第三方使用接口方法详解

    Java提供给第三方使用接口方法是指使用Java编写一个库,供其他开发者在自己的项目中使用,这个库就是接口。接口提供了一种标准化、规范化的编程方法,让编写代码变得更加高效和可维护。 下面是Java提供给第三方使用接口方法的详细攻略: 1.编写接口类: 接口是一种抽象的数据类型,它只有方法声明,没有方法体。接口用于定义某种功能的标准,而不关心这个功能的具体实现…

    Java 2023年5月26日
    00
  • mybatisPlus自定义批量新增的实现代码

    下面我将详细讲解如何实现mybatisPlus自定义批量新增的实现代码,包括两条示例: 自定义批量新增实现代码 mybatisPlus并不支持批量新增操作,所以需要我们手动实现,下面是具体的代码实现: public interface CustomBatchInsertMapper<T> extends BaseMapper<T> {…

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