【新增】将授权模块抽取到网关、由网关做统一的认证

This commit is contained in:
wangiegie@gmail.com 2017-10-28 17:55:13 +08:00
parent 4fe31d05c5
commit 3bdebfdd43
14 changed files with 77 additions and 64 deletions

View File

@ -0,0 +1,30 @@
package com.github.pig.common.web;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import java.util.Base64;
/**
* @author lengleng
* @date 2017/10/28
*/
public class BaseController {
@Autowired
private HttpServletRequest request;
/**
* 根据请求heard中的token获取用户
* @return
*/
public String getUser() {
String authorization = request.getHeader("Authorization");
String token = StringUtils.substringAfter(authorization, "Bearer ");
String key = Base64.getEncoder().encodeToString("pig".getBytes());
Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
return claims.get("user_name").toString();
}
}

View File

@ -18,10 +18,10 @@
</parent> </parent>
<dependencies> <dependencies>
<!--oauth2.0-->
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>com.github.pig</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId> <artifactId>pig-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -1,13 +1,9 @@
package com.github.pig.demo; package com.github.pig.common;
import com.github.pig.demo.annotation.HasAdminRole; import com.github.pig.common.web.BaseController;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.security.access.method.P;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -21,11 +17,10 @@ import java.security.Principal;
@SpringBootApplication @SpringBootApplication
@EnableDiscoveryClient @EnableDiscoveryClient
@RestController @RestController
@EnableGlobalMethodSecurity(prePostEnabled = true) public class DemoResourceApplication extends BaseController {
public class DemoResourceApplication {
@GetMapping("/demo") @GetMapping("/demo")
public Principal demo(Principal principal) { public String demo() {
return principal; return getUser();
} }
@RequestMapping("/user") @RequestMapping("/user")
@ -36,9 +31,4 @@ public class DemoResourceApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(DemoResourceApplication.class, args); SpringApplication.run(DemoResourceApplication.class, args);
} }
// @Bean
// LoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalance) {
// return new LoadBalancerInterceptor(loadBalance);
// }
} }

View File

@ -1,17 +0,0 @@
package com.github.pig.demo.annotation;
import org.springframework.security.access.prepost.PreAuthorize;
import java.lang.annotation.*;
/**
* @author lengleng
* @date 2017/10/28
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@PreAuthorize("('ROLE_ADMIN22')")
public @interface HasAdminRole {
}

View File

@ -4,15 +4,6 @@ spring:
application: application:
name: pig-demo-service name: pig-demo-service
security:
sessions: stateless
oauth2:
resource:
loadBalanced: true
user-info-uri: http://pig-service-auth/user
prefer-token-info: false
service-id: pig-demo-service
eureka: eureka:
instance: instance:
prefer-ip-address: true prefer-ip-address: true

View File

@ -18,6 +18,11 @@
</parent> </parent>
<dependencies> <dependencies>
<dependency>
<groupId>com.github.pig</groupId>
<artifactId>pig-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId> <artifactId>spring-cloud-starter-zuul</artifactId>
@ -27,6 +32,11 @@
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId> <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency> </dependency>
<!--oauth2.0-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
/** /**
* @author lengleng * @author lengleng
@ -11,6 +12,7 @@ import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy @EnableZuulProxy
@EnableDiscoveryClient @EnableDiscoveryClient
@SpringBootApplication @SpringBootApplication
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class PigGatewayApplication { public class PigGatewayApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -1,4 +1,4 @@
package com.github.pig.demo.config; package com.github.pig.gateway.config;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -22,8 +22,9 @@ public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter
@Override @Override
public void configure(HttpSecurity http) throws Exception { public void configure(HttpSecurity http) throws Exception {
http.anonymous().disable() http
.authorizeRequests() .authorizeRequests()
.antMatchers("/auth/**").permitAll()
.anyRequest().access("@permissionService.hasPermission(request,authentication)"); .anyRequest().access("@permissionService.hasPermission(request,authentication)");
} }

View File

@ -1,4 +1,4 @@
package com.github.pig.demo.service; package com.github.pig.gateway.service;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;

View File

@ -1,8 +1,8 @@
package com.github.pig.demo.service.impl; package com.github.pig.gateway.service.impl;
import com.github.pig.demo.service.PermissionService; import com.github.pig.gateway.service.PermissionService;
import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.AntPathMatcher; import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher; import org.springframework.util.PathMatcher;
@ -18,8 +18,6 @@ import java.util.Set;
@Service("permissionService") @Service("permissionService")
public class PermissionServiceImpl implements PermissionService { public class PermissionServiceImpl implements PermissionService {
private PathMatcher pathMatcher = new AntPathMatcher();
@Override @Override
public boolean hasPermission(HttpServletRequest request, Authentication authentication) { public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
Object principal = authentication.getPrincipal(); Object principal = authentication.getPrincipal();
@ -31,7 +29,7 @@ public class PermissionServiceImpl implements PermissionService {
urls.add("/demo"); urls.add("/demo");
for (String url : urls) { for (String url : urls) {
if (pathMatcher.match(url, request.getRequestURI())) { if (request.getRequestURI().contains(url)){
hasPermission =true; hasPermission =true;
break; break;
} }

View File

@ -25,7 +25,11 @@ eureka:
serviceUrl: serviceUrl:
defaultZone: http://127.0.0.1:9000/eureka/ defaultZone: http://127.0.0.1:9000/eureka/
#关闭安全校验
management:
security: security:
enabled: false sessions: stateless
oauth2:
resource:
loadBalanced: true
user-info-uri: http://pig-service-auth/user
prefer-token-info: false
service-id: pig-gateway

View File

@ -33,11 +33,6 @@
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId> <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency> </dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
</dependencies> </dependencies>

View File

@ -1,6 +1,7 @@
package com.github.pig.auth.config; package com.github.pig.auth.config;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
@ -45,8 +46,15 @@ public class PigAuthorizationConfig extends AuthorizationServerConfigurerAdapter
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints endpoints
.tokenStore(new RedisTokenStore(redisConnectionFactory)) .tokenStore(new RedisTokenStore(redisConnectionFactory))
.accessTokenConverter(new JwtAccessTokenConverter()) .accessTokenConverter(jwtAccessTokenConverter())
.authenticationManager(authenticationManager) .authenticationManager(authenticationManager)
.userDetailsService(userDetailsService); .userDetailsService(userDetailsService);
} }
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter(){
JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
jwtAccessTokenConverter.setSigningKey("pig");
return jwtAccessTokenConverter;
}
} }

View File

@ -44,6 +44,7 @@
</dependencies> </dependencies>
<modules> <modules>
<module>pig-common</module>
<module>pig-eureka</module> <module>pig-eureka</module>
<module>pig-config</module> <module>pig-config</module>
<module>pig-gateway</module> <module>pig-gateway</module>