测试 spring security 机制
authorTang Cheng <cheng.tang@supwisdom.com>
Thu, 18 Apr 2019 00:38:35 +0000 (08:38 +0800)
committerTang Cheng <cheng.tang@supwisdom.com>
Fri, 19 Apr 2019 08:35:44 +0000 (16:35 +0800)
build.gradle
src/main/java/com/supwisdom/dlpay/ServletInitializer.kt
src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java [moved from src/main/java/com/supwisdom/dlpay/framework/domain/AppClientRedis.java with 95% similarity]
src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java
src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java [moved from src/main/java/com/supwisdom/dlpay/framework/redisrepo/AppClientRepository.java with 51% similarity]
src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt [moved from src/main/kotlin/com/supwisdom/dlpay/DlpayApplication.kt with 89% similarity]
src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt

index c2dbbbc..d027592 100644 (file)
@@ -33,6 +33,7 @@ dependencies {
     implementation 'org.springframework.security:spring-security-oauth2-jose'
     implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
     implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
+    implementation 'org.springframework.session:spring-session-data-redis:2.0.10.RELEASE'
     implementation 'org.jetbrains.kotlin:kotlin-reflect'
     implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
 
index 65545c7..b03a1dc 100644 (file)
@@ -6,7 +6,7 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
 class ServletInitializer : SpringBootServletInitializer() {
 
        override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder {
-               return application.sources(DlpayApplication::class.java)
+               return application.sources(PayApiApplication::class.java)
        }
 
 }
index e43e411..86060cf 100644 (file)
@@ -28,11 +28,16 @@ public class JwtTokenUtil {
   public String generateToken(Map<String, Object> params) throws JoseException {
     JwtClaims claims = new JwtClaims();
     claims.setIssuer(params.get("issuer").toString());  // who creates the token and signs it
+    if (params.get("audience") != null) {
+      claims.setAudience(params.get("audience").toString());
+    }
     claims.setExpirationTimeMinutesInTheFuture(expiration / 60); // time when the token will expire (10 minutes from now)
-    claims.setGeneratedJwtId(); // a unique identifier for the token
+    claims.setGeneratedJwtId();
     claims.setIssuedAtToNow();  // when the token was issued/created (now)
     claims.setNotBeforeMinutesInThePast(2); // time before which the token is not yet valid (2 minutes ago)
-    claims.setSubject(params.get("subject").toString()); // the subject/principal is whom the token is about
+    if (params.get("subject") != null) {
+      claims.setSubject(params.get("subject").toString()); // the subject/principal is whom the token is about
+    }
     /*
     claims.setClaim("email", "mail@example.com"); // additional claims/attributes about the subject can be added
     List<String> groups = Arrays.asList("group-one", "other-group", "group-three");
@@ -5,7 +5,7 @@ import org.springframework.data.redis.core.RedisHash;
 import javax.persistence.Id;
 
 @RedisHash("app_client")
-public class AppClientRedis {
+public class ApiClientRedis {
   private @Id
   String id;
 
index 5f19465..35f2610 100644 (file)
@@ -6,7 +6,7 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 
 @Entity
-@Table(name = "TT_APICLIENT")
+@Table(name = "TB_APICLIENT")
 public class TApiClient {
   @Id
   @Column(name = "appid", nullable = false, length = 20)
@@ -1,7 +1,7 @@
 package com.supwisdom.dlpay.framework.redisrepo;
 
-import com.supwisdom.dlpay.framework.domain.AppClientRedis;
+import com.supwisdom.dlpay.framework.domain.ApiClientRedis;
 import org.springframework.data.repository.CrudRepository;
 
-public interface AppClientRepository extends CrudRepository<AppClientRedis, String> {
+public interface ApiClientRepository extends CrudRepository<ApiClientRedis, String> {
 }
@@ -16,9 +16,9 @@ import org.springframework.data.redis.connection.RedisPassword
 import org.springframework.data.redis.connection.RedisStandaloneConfiguration
 import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration
 import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
-import org.springframework.data.redis.core.RedisKeyValueTemplate
-import org.springframework.data.redis.core.RedisTemplate
 import org.springframework.data.redis.repository.configuration.EnableRedisRepositories
+import org.springframework.security.authentication.ProviderManager
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider
 import org.springframework.security.config.annotation.web.builders.HttpSecurity
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
@@ -53,7 +53,7 @@ class AppConfig {
                 .readFrom(ReadFrom.SLAVE_PREFERRED)
                 .build()
         val serverConfig = RedisStandaloneConfiguration(server, port)
-        if (!password.isNullOrEmpty()) {
+        if (password.isNotEmpty()) {
             serverConfig.password = RedisPassword.of(password)
         }
         serverConfig.database = database
@@ -74,12 +74,23 @@ class WebSecurityConfig {
         return manager
     }
 
+    @Bean
+    fun daoProvider(detailsService: UserDetailsService): DaoAuthenticationProvider {
+        return DaoAuthenticationProvider().also {
+            it.setUserDetailsService(detailsService)
+        }
+    }
+
+    @Bean
+    fun providerManager(daoProvider: DaoAuthenticationProvider): ProviderManager {
+        return ProviderManager(listOf(daoProvider))
+    }
+
+
     companion object {
         @Configuration
         @Order(1)
         class ApiWebSecurityConfigurationAdapter : WebSecurityConfigurerAdapter() {
-//            @Autowired
-//            private lateinit var clientRegistrationRepository: ClientRegistrationRepository
 
             override fun configure(http: HttpSecurity) {
                 http.authorizeRequests()
@@ -125,8 +136,8 @@ class WebSecurityConfig {
 
 
 @SpringBootApplication
-class DlpayApplication
+class PayApiApplication
 
 fun main(args: Array<String>) {
-    runApplication<DlpayApplication>(*args)
+    runApplication<PayApiApplication>(*args)
 }
index e776623..fe3c279 100644 (file)
@@ -7,6 +7,8 @@ import com.supwisdom.dlpay.framework.domain.AppClientRedis
 import com.supwisdom.dlpay.framework.redisrepo.AppClientRepository
 import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil
 import com.supwisdom.dlpay.framework.security.validate.VerifyCode
+import com.supwisdom.dlpay.framework.domain.ApiClientRedis
+import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.HmacUtil
 import org.springframework.beans.factory.annotation.Autowired
@@ -27,7 +29,7 @@ import javax.servlet.http.HttpServletResponse
 class ApiAuthController {
 
     @Autowired
-    lateinit var repo: AppClientRepository
+    lateinit var repo: ApiClientRepository
 
     @Autowired
     lateinit var apiClient: ApiClientDao
@@ -52,7 +54,7 @@ class ApiAuthController {
         }.let {
             val token = generateRandomToken()
             val now = systemUtil.sysdatetime.hostdatetime
-            AppClientRedis().apply {
+            ApiClientRedis().apply {
                 id = appid
                 loginTimestamp = now
                 this.token = HmacUtil.HMACSHA256(token, it.secret)
@@ -72,8 +74,8 @@ class ApiAuthController {
         return Base64.getEncoder().encode(random).toString(Charsets.UTF_8)
     }
 
-    private fun checkSecretToken(app: AppClientRedis, secret: String): Boolean {
-        return (app.token == secret)
+    private fun checkSecretToken(api: ApiClientRedis, secret: String): Boolean {
+        return (api.token == secret)
     }
 
     @GetMapping("/authentication")
@@ -117,4 +119,4 @@ class WebHomeController {
 
     @GetMapping("/login")
     fun loginView() = "login"
-}
\ No newline at end of file
+}