1. 程式人生 > >Spring Security的高階認識,在上一篇我們已經初步的瞭解到了Spring Secuity

Spring Security的高階認識,在上一篇我們已經初步的瞭解到了Spring Secuity

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,第三方應用
  1. 使用者訪問 Client
  2. Client 向該使用者請求/申請授權
  3. 使用者同意 Client 授權申請
  4. Client 向 Provider 的 Authorization Server 申請令牌
  5. Provider 向 Client 發放令牌
  6. Client 向 Provider 的 Resource Server 申請獲取資源
  7. Provider 向 Client 開放資源
  8. Client 持續攜帶令牌訪問 Provider 上的資源。

OAuth 協議中的四種授權模式(涉及上述第 2 步):

  • 授權碼模式(功能最完整,流程最嚴密,應用最廣泛)
  • 密碼模式
  • 客戶端模式
  • 簡化模式

授權碼模式:

授權碼的模式的特點在於,“使用者同意 Client 授權申請” 的過程是 使用者 - Client - Provider 三方之間的交流:

  • 使用者訪問 Client 之後,Client 會將使用者導向 Provider,Provider 向用戶詢問是否對 Client 授權
  • 使用者同意授權後,Provider 向 Client 返回一個授權碼。
  • Client 再用授權碼申請 Token
  • Provider 確認授權碼後發放 Token
  • Client 攜帶 Token 訪問使用者在 Provider 上的資源

第三方登入原理