spirng-boot中,基于既有的token验证方式,利用spring-security实现权限系统
2017-03-27 23:04
1121 查看
非常感谢 https://segmentfault.com/a/1190000007751220
用过spring-security的都应该能感觉到,spring-security把authentication和authorization封装的比较死。默认的authorization是基于session的。利用session验证过的信息,保存进SecurityContext,权限系统再根据SecurityContext保存的用户权限相关信息,来进行权限管理。
但是在目前的场景中,服务器端往往要满足多端的验证方式,session的方式不容易和移动端配合的好。更多的是用一个token放在http header中进行验证。这种就需要绕开spring-security默认的authentication直接利用它的authorization。
在这里我演示一个在spring-security做方法级别拦截的方案。
这里就是基于token的spring-boot安全拦截配置
在这里,我们要做的其实就是设置重在
我们再来看一下
Authentication而已。
public interface Authentication extends Principal, Serializable {
}
在这里我们还要构造一个机遇token的Authentication接口的实现。在实现中对于权限来说很有用的就是
这样我们就可以给我们的Controller方法做拦截了~
用过spring-security的都应该能感觉到,spring-security把authentication和authorization封装的比较死。默认的authorization是基于session的。利用session验证过的信息,保存进SecurityContext,权限系统再根据SecurityContext保存的用户权限相关信息,来进行权限管理。
但是在目前的场景中,服务器端往往要满足多端的验证方式,session的方式不容易和移动端配合的好。更多的是用一个token放在http header中进行验证。这种就需要绕开spring-security默认的authentication直接利用它的authorization。
在这里我演示一个在spring-security做方法级别拦截的方案。
这里就是基于token的spring-boot安全拦截配置
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) @Order(1) public class TokenBasedSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) { try { http.addFilterBefore(... SecurityContextPersistenceFilter.class); http.securityContext().securityContextRepository(new SecurityContextRepository() { @Override public SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder) { ... } @Override public void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response) { ... } @Override public boolean containsContext(HttpServletRequest request) { ... } }); } catch (Exception e) { e.printStackTrace(); } } }
在这里,我们要做的其实就是设置重在
SecurityContextRepository。这个实体在spring security启动中要传递给
SecurityContextPersistenceFilter。这个filter根据request来加载
SecurityContext。而
SecurityContextPersistenceFilter就是从其内部的
SecurityContextRepository来加载
SecurityContext的。所以我们就需要重载上面代码中的三个方法,根据request来构造
SecurityContext。
我们再来看一下
SecurityContext到底封装了什么。
public interface SecurityContext extends Serializable { Authentication getAuthentication(); void setAuthentication(Authentication authentication); }
Authentication而已。
public interface Authentication extends Principal, Serializable {
Collection<? extends GrantedAuthority> getAuthorities(); Object getCredentials(); Object getDetails(); Object getPrincipal(); boolean isAuthenticated();
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
在这里我们还要构造一个机遇token的Authentication接口的实现。在实现中对于权限来说很有用的就是
getAuthorities方法。我们只要给其封装最简单的
SimpleGrantedAuthority就好了。
这样我们就可以给我们的Controller方法做拦截了~
@RestController @RequestMapping(value = "test") public class TestController { @PreAuthorize("hasAuthority('super_admin')") @RequestMapping(value = "hello", method = RequestMethod.GET) public String superHello(@RequestParam String domain) { return new String("super hello"); } }
相关文章推荐
- 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- Spring Security + JWT 实现基于Token的安全验证
- springboot+angular项目 使用token方式进行权限验证
- 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)
- 基于SpringBoot框架的权限管理系统--sbed
- 基于身份验证票据的权限系统的实现之源代码篇
- Spring Boot+Spring Security+JWT 实现 RESTful Api 权限控制
- 教育办公系统集成 spring-security 框架实现权限模块
- springboot-30-security(三)使用注解实现权限控制
- 基于身份验证票据的权限系统的实现之源代码篇
- 基于Spring+SpringMVC+Hibernate框架系统, 利用SpringAOP实现写日志,切入点的Controller层出现@AutoWire 注入Service为null的情况分析
- Asp.net Mvc4 基于Authorize实现的模块权限验证方式
- 构建基于CXF的WebService服务(3)-- 利用拦截器实现权限验证
- 基于SOAP的Web安全调用机制-----Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS-Security【未试验】
- Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS-Security(基于SOAP的Web安全调用机制)