2009-07-22 5 views
7

Я использую Spring, Spring Security, BlazeDS, Flex и spring-flex.Как проверить Spring Security для аутентификации пользователей и получить роли от Flex?

Я знаю, что могу позвонить channelSet.login() и channelSet.logout(), чтобы подключить Spring Security для аутентификации. channelSet.authenticated, по-видимому, знает только о текущем сеансе Flex, так как он всегда начинается с false, пока вы не позвоните channelSet.login().

Что я хочу сделать:

  1. Проверка от Flex знать, если пользователь уже в сеансе.
  2. Если это так, я хочу их имя пользователя и роли.

UPDATE
Я просто думал, что я хотел бы добавить детали решения я использовал от ответа brd6644 «s ниже, так что это может быть проще для кого-то, кто смотрит это. Я использовал this ответ StackOverflow, чтобы сделать инъекцию SecurityContext. Я не буду переписывать код из этого ответа в этом, поэтому посмотрите на него для 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> 

ответ

3

Если вы используете Spring Blazeds integration, вы можете реализовать метод getUserDetails с помощью org.springframework.flex.security.AuthenticationResultUtils.

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

Это было намного лучше, чем у меня.Он работал очень хорошо и сэкономил много кода. –

2

Я хотел бы написать обеспеченный метод службы Spring, который возвращает роли информации текущего пользователя. Пусть приложение Flex вызывает это при запуске приложения. Если вы получили FaultEvent из-за ошибки безопасности, попросите пользователя выполнить аутентификацию и использовать ChannelSet.login().

+0

Это работало очень хорошо. Спасибо. –

+0

Приятная идея, попробуем это. – JamesC

0

Посмотрите этот блог, я последовал за этим до того, как весна имела гибкий модуль, который прекрасно решает эту проблему. Надеюсь, он предоставит вам несколько драгоценных камней, которые могут помочь.

GridShore Blog

+0

Люди, комментирующие свои сообщения в блоге, похоже, испытывают те же проблемы, что и я; в основном, что входы и выходы были легкими из Flex, но замечать существующий сеанс не было. Решение brd6644 отлично справилось с этим. –

 Смежные вопросы

  • Нет связанных вопросов^_^