Kotlin和Spring安全

SpringSecurity是一个令人惊奇的项目–它解决了业内一些最困难的问题,并帮助人们保护他们的应用程序。而且,似乎这还不够,它显示了坚定的决心,以确保安全容易。如果您在最早的版本中使用过SpringSecurity,您就会知道它需要负载为了完成任何事情。这一点得到了改进,在SpringSecurity 3中,您可以使用XML的一两个节来锁定具有常识的默认应用程序。然后,在SpringSecurity4中,他们引入了一个JavaDSL,它使人们能够通过编译器来帮助他们验证事情。随着时间的推移,SpringSecurity也逐渐引入了常识缺省。现在,您可以注册一个UserDetailsServiceSpringSecurity将锁定基于servlet的HTTP应用程序中的所有HTTP端点,并需要身份验证。再简单不过了!或者可以?在SpringSecurity5.2中,他们引入了对SpringSecurity的一些备受赞赏的改进。现在,除了使用以前的FluidJava配置DSL之外,还有一种新的方法,您可以提供lambda并为其提供上下文对象,然后您可以使用它。您不再需要缩进您的SpringSecurityAPI来理解它们的意图了!现在,在这篇文章中,我们将以非常快的速度查看全新的SpringSecurityKotlinDSL。

请记住,SpringSecurity解决了两个正交问题:身份验证和授权。身份验证回答了以下问题:“谁提出请求吗?“是Josh,还是Jane?授权回答了一个问题:”请求者在系统内拥有什么权限?“身份验证完全是为了插入身份提供程序。有无数种方法(ActiveDirectory、内存中的用户名和密码、LDAP、SAML等)–更多的是插入实现。我们只打算使用内存中的用户名和密码认证管理器,因为我们需要它,而且DSL并不是真正的亮点。”

DSL最有用的不是用于交换给定类型的实现,而是用于描述规则或自定义行为。因此,我们将使用SpringSecurityDSL自定义授权行为。

下面是一个使用SpringSecurity的基于SpringBoot的应用程序。我从弹簧起爆它使用Kotlin,并使用SpringSecurity和SpringBoot2.3.M2或更高版本。它使用Functionalbean注册DSL来编程注册bean。我们讨论了程序bean注册。在.弹簧尖2017年waaaay的视频。当然,该视频演示了它在Java中的使用,但是应用程序在Kotlin中基本上是一样的:通过将bean包装为调用bean功能。

第一个bean是InMemoryUserDetailsManager。第二个bean是一个功能性HTTP端点,/greetings。当HTTP请求传入时,我们从当前请求中提取经过身份验证的主体,提取名称,然后构建一个ServerResponse其身体将由一个Map.

有趣的是这个类KotlinSecurityConfiguration。它扩展了WebSecurityConfigurerAdapter。有几种方法我们可以在那里重写,但是我选择了覆盖configure方法来指定两件事:我想选择加入HTTP基本身份验证,并指定哪些路由需要身份验证,哪些路由是广泛开放的。下面的配置规定所有请求/greetings/()/greetings/端点,以及它下面的任何东西,比如/greetings/foo)必须经过认证。第二条规则是,其他一切都是开放的。非常重要的是更具体的规则-/greetings/-到更开放的规则前来.规则按顺序从上到下进行评估。如果我们把第二条规则放在第一位,那么它就会匹配每个请求,我们就不需要对规则进行评估了。/greetings-它实际上是完全开放的!

package com.example.kotlinsecurity
2
3
import org.springframework.boot.autoconfigure.SpringBootApplication
4
import org.springframework.boot.runApplication
5
import org.springframework.context.annotation.Bean
6
import org.springframework.context.support.beans
7
import org.springframework.security.config.annotation.web.builders.HttpSecurity
8
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
9
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
10
import org.springframework.security.config.web.servlet.invoke
11
import org.springframework.security.core.userdetails.User
12
import org.springframework.security.provisioning.InMemoryUserDetailsManager
13
import org.springframework.web.servlet.function.ServerResponse
14
import org.springframework.web.servlet.function.router
15
16
@SpringBootApplication
17
class KotlinSecurityApplication
18
19
@EnableWebSecurity
20
class KotlinSecurityConfiguration : WebSecurityConfigurerAdapter() {
21
22
    override fun configure(http: HttpSecurity?) {
23
        http {
24
            httpBasic {}
25
            authorizeRequests {
26
                authorize("/greetings/**", hasAuthority("ROLE_ADMIN"))
27
                authorize("/**", permitAll)
28
            }
29
        }
30
    }
31
}
32
33
fun main(args: Array) {
34
    runApplication(*args) {
35
        addInitializers(beans {
36
            bean {
37
38
                fun user(user: String, pw: String, vararg roles: String) =
39
                    User.withDefaultPasswordEncoder().username(user).password(pw).roles(*roles).build()
40
41
                InMemoryUserDetailsManager(user("jlong", "pw", "USER"), user("rwinch", "pw1", "USER", "ADMIN"))
42
            }
43
            bean {
44
                router {
45
                    GET("/greetings") { request ->
46
                        request.principal().map { it.name }.map { ServerResponse.ok().body(mapOf("greeting" to "Hello, $it")) }.orElseGet { ServerResponse.badRequest().build() }
47
                    }
48
                }
49
            }
50
        })
51
    }
52
}

结语

在本期文章中,我们介绍了SpringSecurity的新Kotlin DSL。有比代码更多的文本,因为SpringSecurity做了一个罗得所以API的表面积实际上是您想要进行的自定义的最小值,而不是已经合理的默认设置。我希望你学到了一些新东西,并且会给SpringSecurityDSL一个机会。

你可能感兴趣的:(JAVA,后端,java,spring)