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日

相关文章

  • 微信小程序登陆注册功能的实现代码

    接下来我将详细讲解微信小程序登陆注册功能的实现代码攻略。 一、前置知识 在实现微信小程序的登陆注册功能前,我们需要掌握一些基础知识。 WXML:微信小程序的模板语言,用于构建页面结构。 WXSS:微信小程序的样式语言,用于设置页面样式。 JavaScript:实现小程序的逻辑处理和数据存储。 云开发:微信小程序提供的一种快速开发后端服务的开发方式,包含云函数…

    Java 2023年5月23日
    00
  • PHP禁止页面缓存的代码

    下面是PHP禁止页面缓存的完整攻略。 1. 禁止缓存的原因 禁止页面缓存是为了确保用户每次访问网页都能获取到最新的数据,否则如果网页被缓存,用户将会看到旧的或者过期的数据,影响其体验。 2. 禁止缓存的方式 禁止页面缓存的方式有多种,常用的方式主要有以下两种: 2.1. 在HTTP响应头中添加Cache-Control头部 可以在所有页面的 HTTP 响应头…

    Java 2023年6月16日
    00
  • Spring Boot Admin 添加报警提醒和登录验证功能的具体实现

    下面我来详细讲解Spring Boot Admin添加报警提醒和登录验证功能的具体实现。 1. 添加报警提醒 1.1 准备工作 首先,我们需要准备以下工作: 安装 Spring Boot Admin 安装 Spring Boot Admin Server Extensions 扩展 1.2 添加报警提醒功能 在 spring-boot-admin-serve…

    Java 2023年6月3日
    00
  • SpringCloud Feign使用ApacheHttpClient代替默认client方式

    SpringCloud Feign使用ApacheHttpClient代替默认client方式 在SpringCloud中,Feign默认使用URLConnection作为HTTP客户端发送请求。但是,我们可以通过修改配置,使用基于Apache HttpClient的方式发送HTTP请求代替默认的URLConnection。这样可以获得更好的性能和可配置性。…

    Java 2023年6月2日
    00
  • JSP中使用JavaScript动态插入删除输入框实现代码

    下面是“JSP中使用JavaScript动态插入删除输入框实现代码”的完整攻略。 简介 JSP是一种动态网页技术,而JavaScript是一种脚本语言,两者可以结合使用,达到更好的用户交互效果。此次攻略将详细讲解如何在JSP页面中使用JavaScript实现动态插入删除输入框的功能。 实现步骤 实现插入输入框功能 在JSP页面中添加一个按钮,用于触发插入输入…

    Java 2023年6月15日
    00
  • SpringBoot利用自定义注解实现多数据源

    搭建多数据源环境 首先,我们需要在pom.xml中引入所需依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </depen…

    Java 2023年5月20日
    00
  • jsp cookie+session实现简易自动登录

    当用户登录后,在一定时间内不需要再进行登录操作,而是直接跳转到主页,这种操作是自动登录。实现自动登录涉及到在浏览器端保存用户的登录信息,并在下一次访问时使用该信息验证用户身份。在Java Web开发中,可以使用JSP会话(session)和cookie实现简易自动登录。 实现自动登录的思路 自动登录的实现思路可以分为以下几个步骤: 用户使用正确的用户名和密码…

    Java 2023年6月15日
    00
  • SpringBoot2.6.x升级后循环依赖及Swagger无法使用问题

    Spring Boot 2.6.x 升级后循环依赖及 Swagger 无法使用问题的解决方案 在本文中,我们将详细讲解 Spring Boot 2.6.x 升级后循环依赖及 Swagger 无法使用问题的解决方案。我们将使用 Spring Boot 2.6.0 版本的源码进行分析。 问题一:循环依赖 在 Spring Boot 2.6.x 版本中,循环依赖的…

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