2014-02-19 48 views
0

我的要求是如下:如何使用自定義java類/自定義spring框架類的Spring安全性?

在我們的應用程序的用戶的憑據對數據庫驗證(不使用彈簧安全性,因爲它是一個遺留應用程序)的第一次。如果用戶是有效的用戶,他將登錄到應用程序中。一旦用戶登錄到應用程序,他可以進行幾次休息電話。現在,我想在進行任何休息呼叫之前通過使用彈簧安全性再次驗證用戶的憑證。在這裏,挑戰是我們不應該重新設計數據庫模式。我們需要使用驗證用戶的存儲過程。如果認證失敗,此特定存儲過程將返回錯誤消息,否則不會返回任何內容。在這種情況下沒有定義任何角色。只需使用存儲過程進行簡單認證。現在,我想通過春季安全來完成這件事。可能會編寫一個java類/自定義spring框架的類,並在其中調用存儲過程,並在spring安全性配置文件中使用該類。任何人都可以提出關於如何啓動的想法嗎?

我已經實現了AuthenticationProvider。以下是* security.xml。

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/rest/*" access="permitAll"></intercept-url> 
</http> 

    <authentication-manager > 
    <authentication-provider ref="csAuthenticationProvider" /> 
</authentication-manager> 

但是,安全框架正在尋找的角色。在我的情況下,沒有定義任何角色。正如我前面所說的,用戶第一次沒有使用spring框架進行身份驗證。如果用戶想要進行任何休息呼叫,則彈簧安全需要重新認證用戶。這並不意味着用戶需要重新輸入憑據。由於他已經通過身份驗證,因此用戶的憑證可在剩餘呼叫/請求中使用。唯一需要做的是我需要通過使用請求使用憑據並使用存儲過程重新驗證。當然,使用AuthenticationProvider可能是一個好主意,但驗證(身份驗證身份驗證)方法的參數「身份驗證身份驗證」對我無用,因爲我需要再次調用自己的存儲過程調用。暫時,我沒有使用Authentication對象,而是使用authenticate()方法中的存儲過程調用代碼。但奇怪的是,authenticate()方法沒有被調用。我感到驚訝和困惑。有沒有任何機構對我做錯的地方有任何想法?

+0

這將是偉大的,如果任何人都可以分享我的問題的僞代碼。 –

+0

請詳細描述你正在做什麼。你說「安全框架正在尋找角色」。那是什麼意思?什麼代碼實際上被稱爲?同時解釋如果Spring Security沒有可用的憑據並且您不希望用戶提供任何憑據,您希望Spring Security如何對用戶進行身份驗證。如果您希望僅使用與登錄時相同的HTTP會話,那麼當您對用戶進行身份驗證時,您需要創建一個安全上下文,Spring Security可以將其用於將來的請求。 –

+0

Luke,謝謝!「安全框架正在尋找角色」:這意味着根據我的要求,不需要驗證角色。用戶輸入的憑證在用戶第一次登錄時存儲在請求對象中。我需要使用這些憑證並使用spring安全性(通過存儲過程調用)重新進行身份驗證。當用戶登錄時,我可以使用相同的HTTP會話。請你指導我如何獲得相同的http會話,創建Spring Security上下文並根據上述要求重新進行身份驗證。如果你能分享一些僞代碼,那將是非常好的。 –

回答

0

您可以實現自己的UserDetailsS​​ervice和配置Spring使用它。

<security:authentication-manager> 
    <security:authentication-provider user-service-ref="userDetailsServiceImpl"/> 
</security:authentication-manager> 
+0

感謝您的快速回復。最初,我也是這麼想的。如果我們實現UserDetailsS​​ervice,我們需要重載loadUserByUsername(String username)。但是,一些如何,UserDetailsS​​ervice類沒有被調用。如果你想看看,我會發布代碼。 –

+1

請參閱我在rhinds問題中的評論 - UserDetailsS​​ervice不會執行身份驗證(請參閱[本FAQ](http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/faq)。 html#faq-what-is-userdetailservice)你最好直接實現一個AuthenticationProvider,如果你想封裝你自己的驗證代碼 –

+0

感謝Luke的回覆,我會嘗試按照你所說的實現AuthenticationProvider並讓你知道如果我發現任何問題 –

0

您需要創建一個自定義的UserDetailsS​​ervice實現,它將檢查數據庫。

下面是一個例子UserDetailsS​​ervice的實現,它做到了這一點:

@Service("userService") 
public class UserDetailsServiceImpl implements UserDetailsService, InitializingBean { 

    @Autowired 
    private AccountService accountService; 

    public void afterPropertiesSet() throws Exception { 
    } 

    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
     username = username.toLowerCase(); 
     try { 
      Account account = accountService.loadUserAccountByEmail(username); 
      if (account == null) { 
       throw new UsernameNotFoundException("Could not find email: " + username + "in the DB."); 
      } 

      List<GrantedAuthority> auths = new ArrayList<GrantedAuthority>(); 
      for (Role r : account.getRoles()) { 
       auths.add(new SimpleGrantedAuthority(r.getRole())); 
      } 
      ApplicationUser user = null; 
      try { 
       user = new ApplicationUser(new Long(account.getId()), username, account.getPassword(), true, true, true, true, auths); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
      return user; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw new UsernameNotFoundException(username + "not found", e); 
     } 
    } 

} 

我在代碼的配置,像這樣:

@Override 
    protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .userDetailsService(userDetailsServiceImpl) 
      .passwordEncoder(bCryptPasswordEncoder()); 
    } 

(你也可以看到一個博客帖子我寫了一篇關於從切換xml到@annotation配置爲春季安全轉介項目在這裏:http://automateddeveloper.blogspot.co.uk/2014/02/spring-4-xml-to-annotation-configuration.html

+1

要求是存儲過程用於執行身份驗證UserDetailsS​​ervice不執行身份驗證所以不是一個合適的選項 –

+0

啊是的你是正確的 - 我讀它作爲存儲過程只是抓住用戶數據 - 掩蓋了有關實際在數據庫中進行身份驗證的內容 – rhinds

+0

盧克,你可以請拿l在編輯的內容和建議任何想法? –

相關問題