下面我将详细讲解“Spring Security和Shiro的相同点与不同点整理”,这里进行如下分类阐述:概念、使用场景、安全策略、授权与认证、拦截器等。
一、概念
- Spring Security:基于spring的安全框架,目的是为了给Java应用程序提供声明式的安全访问控制。
- Shiro:一个易于使用的Java安全框架,提供了身份验证、授权、密码和会话管理等功能。
其中,Spring Security被Spring官方所支持,而Shiro是由Apache所提供的。
二、使用场景
两者的使用场景有些相似。Spring Security可以为Web应用程序、REST API和方法级安全提供安全支持,而Shiro可以为Web应用程序、命令行脚本提供安全支持,但Shiro也可以用于企业应用程序的安全方面。
三、安全策略
- Spring Security支持基于角色的访问控制、基于IP的访问控制、基于表达式的访问控制、会话管理、并发控制等安全策略。
- Shiro支持基于角色的访问控制、基于权限的访问控制、基于SSL的安全、Session管理、登入和登出、密码重置等安全策略。
其中,两者都支持基于角色的访问控制。
四、授权与认证
- Spring Security有全套的认证和授权系统,支持多种认证方式(表单认证、基于LDAP和CAS单点登录等)、多种授权方式(JSR-250、自定义授权等)等。
- 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技术站