2009-07-22 14 views
7

Tôi đang sử dụng Spring, Spring Security, BlazeDS, Flex và spring-flex.Làm cách nào để kiểm tra Xác thực mùa xuân để xác thực người dùng và nhận vai trò từ Flex?

Tôi biết rằng tôi có thể gọi channelSet.login()channelSet.logout() để kết nối với Spring Security để xác thực. channelSet.authenticated dường như chỉ biết về phiên Flex hiện tại, vì nó luôn bắt đầu là false, cho đến khi bạn gọi channelSet.login().

Những gì tôi muốn làm:

  1. Kiểm tra từ Flex biết nếu người dùng đã có trong một phiên làm việc.
  2. Nếu có, tôi muốn tên người dùng và vai trò của họ.

CẬP NHẬT
Tôi chỉ nghĩ rằng tôi muốn thêm chi tiết về các giải pháp tôi sử dụng từ brd6644 's câu trả lời dưới đây, do đó điều này có thể dễ dàng hơn cho ai đó trông này lên. Tôi đã sử dụng câu trả lời this StackOverflow để làm cho tiêm SecurityContext. Tôi sẽ không viết lại mã từ câu trả lời đó trong câu trả lời này, vì vậy hãy xem xét nó cho số SecurityContextFacade.

securityServiceImpl.java

public class SecurityServiceImpl implements SecurityService { 
    private SecurityContextFacade securityContextFacade; 

    @Secured({"ROLE_PEON"}) 
    public Map<String, Object> getUserDetails() { 
     Map<String,Object> userSessionDetails = new HashMap<String, Object>(); 

     SecurityContext context = securityContextFacade.getContext(); 
     Authentication auth = context.getAuthentication(); 
     UserDetails userDetails = (UserDetails) auth.getPrincipal(); 

     ArrayList roles = new ArrayList(); 
     GrantedAuthority[] grantedRoles = userDetails.getAuthorities(); 
     for (int i = 0; i < grantedRoles.length; i++) { 
      roles.add(grantedRoles[i].getAuthority()); 
     } 

     userSessionDetails.put("username", userDetails.getUsername()); 
     userSessionDetails.put("roles", roles); 
     return userSessionDetails; 
    } 
} 


securityContext.xml

<security:http auto-config="true"> 
    <!-- Don't authenticate Flex app --> 
    <security:intercept-url pattern="/flexAppDir/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <!-- Don't authenticate remote calls --> 
    <security:intercept-url pattern="/messagebroker/amfsecure" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
</security:http> 

<security:global-method-security secured-annotations="enabled" /> 

<bean id="securityService" class="ext.domain.project.service.SecurityServiceImpl"> 
    <property name="securityContextFacade" ref="securityContextFacade" /> 
</bean> 
<bean id="securityContextFacade" class="ext.domain.spring.security.SecurityContextHolderFacade" /> 


flexContext.xml

<flex:message-broker> 
    <flex:secured /> 
</flex:message-broker> 

<flex:remoting-destination ref="securityService" /> 
<security:http auto-config="true" session-fixation-protection="none"/> 


FlexSecurityTest.mxml

<mx:Application ... creationComplete="init()"> 

    <mx:Script><![CDATA[ 
     [Bindable] 
     private var userDetails:UserDetails; // custom VO to hold user details 

     private function init():void { 
      security.getUserDetails(); 
     } 

     private function showFault(e:FaultEvent):void { 
      if (e.fault.faultCode == "Client.Authorization") { 
       Alert.show("You need to log in."); 
       // show the login form 
      } else { 
       // submit a ticket 
      } 
     } 
     private function showResult(e:ResultEvent):void { 
      userDetails = new UserDetails(); 
      userDetails.username = e.result.username; 
      userDetails.roles = e.result.roles; 
      // show user the application 
     } 
    ]]></mx:Script> 

    <mx:RemoteObject id="security" destination="securityService"> 
     <mx:method name="getUserDetails" fault="showFault(event)" result="showResult(event)" /> 
    </mx:RemoteObject> 

    ... 
</mx:Application> 

Trả lời

3

Nếu bạn sử dụng Spring Blazeds integration, bạn có thể thực hiện phương pháp getUserDetails sử dụng org.springframework.flex.security.AuthenticationResultUtils.

public Map<String, Object> getUserDetails() { 
return AuthenticationResultUtils.getAuthenticationResult(); 
} 
+0

Điều này đã được MUCH tốt hơn so với những gì tôi đã xảy ra.Nó hoạt động rất tốt và đã lưu rất nhiều mã. –

2

Tôi sẽ viết một phương pháp dịch vụ xuân bảo đảm rằng trả về thông tin vai trò của người dùng hiện hành. Hãy để ứng dụng Flex gọi khi ứng dụng khởi động. Nếu bạn nhận được một FaultEvent do lỗi bảo mật, hãy nhắc người dùng xác thực và sử dụng ChannelSet.login().

+0

Điều này làm việc rất tốt. Cảm ơn bạn. –

+0

Ý tưởng hay, chắc chắn sẽ thử điều này. – JamesC

0

Xem blog này, tôi đã theo dõi điều này trước khi Spring có mô-đun flex, giải quyết vấn đề này một cách độc đáo. Hy vọng rằng nó sẽ cung cấp cho bạn một vài viên đá quý có thể giúp bạn.

GridShore Blog

+0

Những người nhận xét về các bài đăng trên blog của anh ấy dường như có cùng vấn đề với tôi; chủ yếu là việc đăng nhập và đăng xuất là dễ dàng từ Flex, nhưng nhận thấy một phiên hiện tại thì không. Giải pháp của brd6644 làm việc hoàn hảo cho việc này. –

Các vấn đề liên quan