我想写一个hello world示例来理解SSO / oauth2
我采取了以下示例:
http://www.baeldung.com/sso-spring-security-oauth2
首先,我需要说它运作正常。我的问题是,它正在发挥作用。
我的问题与客户端应用程序有关。它是一个简单的应用程序,只包含几个类。最重要的课程是:
UiSecurityConfig:
@Configuration
@EnableOAuth2Sso
public class UiSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**")
.permitAll()
.anyRequest()
.authenticated();
}
}
UiWebConfig:
@Configuration
@EnableWebMvc
public class UiWebConfig extends WebMvcConfigurerAdapter {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Override
public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
super.addViewControllers(registry);
registry.addViewController("/")
.setViewName("forward:/index");
registry.addViewController("/index");
registry.addViewController("/securedPage");
}
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
}
以及以下配置:
server:
port: 8082
context-path: /ui
session:
cookie:
name: UISESSION
security:
basic:
enabled: false
oauth2:
client:
clientId: SampleClientId
clientSecret: secret
accessTokenUri: http://localhost:8081/auth/oauth/token
userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
resource:
userInfoUri: http://localhost:8081/auth/user/me
spring:
thymeleaf:
cache: false
问题:
1.当我开始申请并遵循链接http://localhost:8082/ui/时,我会看到登录页面。
此页面包含以下href
:
<a class="btn btn-primary" href="securedPage">Login</a>
当我点击此href
发生某种魔法时,我在网络标签中看到:
如你所见
1. http://localhost:8082/ui/securedPage
重定向到http://localhost:8082/ui/login
2. http://localhost:8082/ui/login
重定向到http://localhost:8081/auth/oauth/authorize?client_id=SampleClientId&redirect_uri=http://localhost:8082/ui/login&response_type=code&state=DuO4CX
(!!!另一个域名!!!怎么样?)
3. http://localhost:8081/auth/oauth/authorize?client_id=SampleClientId&redirect_uri=http://localhost:8082/ui/login&response_type=code&state=DuO4CX
重定向到http://localhost:8081/auth/login
,我看到登录表单,我可以输入凭据
我不明白为什么这种方式有效
1。为什么http://localhost:8082/ui/securedPage
重定向到http://localhost:8082/ui/login
???
我没有这个网址的映射。当我开始应用程序时,我看到以下映射日志:
2018-04-12 19:50:04.069 INFO 4388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Root mapping to handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
2018-04-12 19:50:04.069 INFO 4388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/index] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
2018-04-12 19:50:04.069 INFO 4388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/securedPage] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
2018-04-12 19:50:04.085 INFO 4388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/resources/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-04-12 19:50:04.088 INFO 4388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler]
所有后续步骤也不清楚。请详细解释。
答案 0 :(得分:2)
var users:[UserInfo] = [] {
didSet {
tableView.reloadData()
}
}
未显示在映射的URL列表中,因为它由http://localhost:8082/ui/login
处理,从而启动身份验证流程。
我认为解释所有步骤的最佳方法是使用OAuth 2.0 specification。
以下是流程图:
OAuth2ClientAuthenticationProcessingFilter
资源所有者 - 它是用户
用户代理 - 用户的浏览器
客户 - Web application deployed on 8082 port
授权服务器 - Web application deployed on 8081 port
(A)客户端通过指导资源所有者来启动流程 用户代理到授权端点。客户包括 其客户端标识符,请求的范围,本地状态和a 授权服务器将发送的重定向URI 一旦访问被授予(或被拒绝),用户代理就会返回。
在您尝试访问 +----------+
| Resource |
| Owner |
| |
+----------+
^
|
(B)
+----|-----+ Client Identifier +---------------+
| -+----(A)-- & Redirection URI ---->| |
| User- | | Authorization |
| Agent -+----(B)-- User authenticates --->| Server |
| | | |
| -+----(C)-- Authorization Code ---<| |
+-|----|---+ +---------------+
| | ^ v
(A) (C) | |
| | | |
^ v | |
+---------+ | |
| |>---(D)-- Authorization Code ---------' |
| Client | & Redirection URI |
| | |
| |<---(E)----- Access Token -------------------'
+---------+ (w/ Optional Refresh Token)
的情况下,她会被重定向到securedPage
,从而启动身份验证流程。
之后,用户被重定向到授权端点。在你的情况下它是http://localhost:8082/ui/login
。
(B)授权服务器对资源所有者进行身份验证(通过 用户代理)并确定资源所有者 授予或拒绝客户的访问请求。
此处将用户重定向到授权服务器登录页面(http://localhost:8081/auth/oauth/authorize
)。
(C)假设资源所有者授予访问权限,授权 服务器使用以下命令将用户代理重定向回客户端 前面提供的重定向URI(在请求中或在期间) 客户注册)。重定向URI包括 授权代码和客户端提供的任何本地状态 早。
如果身份验证成功,则使用在授权端点的请求中的步骤(A)中提供的URL将用户重定向回客户端。在你的情况下它是http://localhost:8081/auth/login
。重定向包括授权服务器生成的授权代码。
(D)客户端从授权请求访问令牌 服务器的令牌端点,包括授权码 在上一步收到。在提出请求时, 客户端使用授权服务器进行身份验证客户端 包括用于获取授权的重定向URI 验证码。
(E)授权服务器对客户端进行身份验证,验证客户端 授权代码,并确保重定向URI 收到匹配用于重定向客户端的URI 步骤(C)。如果有效,授权服务器将回复 访问令牌和(可选)刷新令牌。
客户端使用授权代码从令牌端点(&redirect_uri=http://localhost:8082/ui/login
)获取访问令牌。访问令牌用于访问受保护资源。在您的情况下,它是http://localhost:8081/auth/oauth/token
,用于获取有关用户的信息。此信息用于填充安全上下文。