spirng-boot中,基于既有的token验证方式,利用spring-security实现权限系统

转载 2017年03月27日 23:04:36

非常感谢  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安全拦截配置

@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");
    }
}

RESTful登录设计(基于Spring及Redis的Token鉴权)

什么是REST REST(Representational State Transfer)是一种软件架构风格。它将服务端的信息和功能等所有事物统称为资源,客户端的请求实际就是对资源进行操作,它的...
  • gebitan505
  • gebitan505
  • 2016年06月08日 17:59
  • 39444

STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)

1、新建工程 2、选择打包方式,这边可以选择为打包为Jar包,或者传统的打包为War包 3、选择开发过程中使用到的技术,这边我选择的是Rest Repositories 4...
  • he90227
  • he90227
  • 2016年11月23日 17:34
  • 12955

springboot+redis+token保持登录

  • 2017年08月03日 11:46
  • 1.9MB
  • 下载

15.玩转Spring Boot 使用Spring security

玩转Spring Boot 使用Spring security       Spring Boot与Spring Security在一起开发非常简单,充分体现了自动装配的强大,Spring Sec...
  • cl_andywin
  • cl_andywin
  • 2017年01月03日 10:44
  • 14024

Spring Boot实战之Filter实现使用JWT进行接口认证

Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signatu...
  • sun_t89
  • sun_t89
  • 2016年07月16日 10:18
  • 34372

Spring Boot实战之Filter实现使用JWT进行接口认证

 Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Sig...
  • dream8062
  • dream8062
  • 2017年04月27日 19:26
  • 1138

Springboot实现filter拦截token验证和跨域

背景web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需...
  • zjcjava
  • zjcjava
  • 2017年10月14日 21:41
  • 746

Spring Boot实战之Redis缓存登录验证码

Spring Boot实战之Redis缓存登录验证码 本章简单介绍Redis的配置及使用方法,本文示例代码在前面代码的基础上进行修改添加,实现了使用redis进行缓存验证码,以及校验验证码的...
  • sun_t89
  • sun_t89
  • 2016年07月18日 18:14
  • 9903

spring boot-使用Filter实现Header认证

前言 假设客户端在http请求中,已经加入了Header的认证信息,例如: HttpPost post = new HttpPost("http://localhost:8990/sendMail")...
  • liuchuanhong1
  • liuchuanhong1
  • 2017年05月23日 12:02
  • 3583

Spring Boot 微信-验证服务器有效性

概述接入微信公众平台开发,开发者需要按照如下步骤完成: 在自己服务器上,开发验证微信验证服务器地址的有效性逻辑 在微信平台上,填写自己服务器地址信息 在自己服务器上,依据微信接口文档实现业务逻辑 第一...
  • jeikerxiao
  • jeikerxiao
  • 2017年03月29日 13:56
  • 1352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spirng-boot中,基于既有的token验证方式,利用spring-security实现权限系统
举报原因:
原因补充:

(最多只允许输入30个字)