在 中配置了一个独立的OAuth服务器,这里要对Resource,即需要保护的API进行配置,使其在被访问的时候,可以与OAuth服务器通信,根据Access Token获取相关授权信息。
下面会分别讲一下使用Spring MVC和Spring Boot这两种框架时的配置方法。
Spring MVC
- 在pom.xml中配置依赖项和插件
3.2.13.RELEASE 2.0.0.RELEASE 2.5 1.9.13 org.springframework spring-context ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-core ${spring.version} org.codehaus.jackson jackson-core-asl ${jackson.version} org.codehaus.jackson jackson-mapper-asl ${jackson.version} org.springframework.security.oauth spring-security-oauth2 ${spring.oauth.version} org.apache.tomcat.maven tomcat7-maven-plugin 2.0 / 8081 - 添加spring-mvc.xml,配置MVC功能
application/json; charset=UTF-8 - 添加spring-security.xml,配置OAuth保护,使所有API只有角色为ROLE_USER的用户才能访问,注意create-session要设置为stateless,并且配置OAuth服务器连接信息(checkTokenEndpointUrl,clientId和clientSecret)
- 编写受保护的Controller,返回结果为用户名
@Controllerpublic class AuthorizedController { @RequestMapping(value = "/user", produces = "application/json; charset=UTF-8") @ResponseBody public Map
user(Authentication auth) { Map result = new HashMap (); result.put("username", auth.getPrincipal()); return result; }}
Spring Boot
- 在pom.xml中配置依赖项和插件
org.springframework.boot spring-boot-starter-web org.springframework.security.oauth spring-security-oauth2 org.springframework.boot spring-boot-maven-plugin - 在application.properties中配置OAuth服务器信息(security.oauth2.resource.token-info-uri,security.oauth2.client.client-id和security.oauth2.client.client-secret)
server.port=8081security.oauth2.resource.token-info-uri=http://localhost:8080/oauth/check_tokensecurity.oauth2.client.client-id=client1security.oauth2.client.client-secret=secret1
- 编写主类Application,启用Resource服务器功能
@SpringBootApplication@EnableResourceServerpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
- 编写Resource服务器配置类,使所有API只有角色为ROLE_USER的用户才能访问
@Configurationpublic class ResourceConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.antMatcher("/**").authorizeRequests().anyRequest().access("hasAuthority('ROLE_USER')"); }}
测试方法
- 启动OAuth服务器
- 使用Maven运行Goal:Spring MVC为clean compile tomcat7:run,Spring Boot为clean spring-boot:run
- 直接访问http://127.0.0.1:8081/user,会得到如下结果
{ "error": "unauthorized", "error_description": "Full authentication is required to access this resource"}
- 携带Access Token去访问http://127.0.0.1:8081/user,会得到如下结果,其中user就是申请Access Token时使用的用户名
{ "username": "user"}
携带Access Token的方法有两种,第一种是使用名为access_token的参数传递过去,如http://127.0.0.1:8081/user?access_token=#ACCESS_TOKEN#,第二种是使用名为Authorization的Header传递过去,Header值的格式为Bearer #ACCESS_TOKEN#,基于安全考虑,推荐使用第二种
注意
使用Spring MVC时,create-session一定要设置为stateless,否则,在第一次访问成功后,短时间内再访问的时候如果不携带Access Token的话也能访问成功,原因是Spring Security会在第一次访问成功后创建一个session来存储授权信息,而使用Spring Boot则没有这个问题