mirror of https://gitee.com/maxjhandsome/pig
【新增】将授权模块抽取到网关、由网关做统一的认证
This commit is contained in:
parent
4fe31d05c5
commit
3bdebfdd43
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
// }
|
|
||||||
}
|
}
|
|
@ -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 {
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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
|
|
@ -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>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue