2 自定义登录成功处理
默认情况下,登录成功后,Spring Security 会跳转到之前引发登录的那个请求上。
AuthenticationSuccessHandler
@Component("myAuthenticationSuccessHandler")
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
@Autowired
private ObjectMapper objectMapper;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
System.out.println("登录成功");
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString(authentication));
}
}
@Configuration
@EnableWebSecurity
@ComponentScan("com.sxnd.authentication")
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("myAuthenticationSuccessHandler")
private AuthenticationSuccessHandler successHandler;
@Bean("objectMapper")
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginPage("/sign-in.html")
.loginProcessingUrl("/login")
.successHandler(successHandler)
.and()
...
}
}
短信验证码登录
生成 - 存session - 发送
Spring Social 开发第三方登录
OAuth
用户名密码授权的问题:
- 应用可以访问用户在微信上的所有数据
- 用户只有修改密码,才能收回授权(但又会引起其他问题)
- 密码泄露的可能性大大增加
用户给 APP 的是token,而不再是用户名密码。App 通过携带token去访问微信自拍照片。token中可以设置有效期。
- Provider,服务提供商(例如,微信)
- Authorization Server(认证,发令牌)
- Resource Server(保存资源)
- Resource,资源(例如,微信自拍照片)
- Resource Owner,资源所有者(例如,微信用户。注意,自拍照片的所有者并非微信)
- Client,第三方应用
- 用户访问 Client
- Client 向该用户请求/申请授权
- 用户同意 Client 授权申请
- Client 向 Provider 的 Authorization Server 申请令牌
- Provider 向 Client 发放令牌
- Client 向 Provider 的 Resource Server 申请获取资源
- Provider 向 Client 开放资源
- Client 持续携带令牌访问 Provider 上的资源。
OAuth 协议中的四种授权模式(涉及上述第 2 步):
- 授权码模式(功能最完整,流程最严密,应用最广泛)
- 密码模式
- 客户端模式
- 简化模式
授权码模式:
授权码的模式的特点在于,“用户同意 Client 授权申请” 的过程是 用户 - Client - Provider 三方之间的交流:
- 用户访问 Client 之后,Client 会将用户导向 Provider,Provider 向用户询问是否对 Client 授权
- 用户同意授权后,Provider 向 Client 返回一个授权码。
- Client 再用授权码申请 Token
- Provider 确认授权码后发放 Token
- Client 携带 Token 访问用户在 Provider 上的资源