Wie kann ich überprüfen, Spring Security für die Authentifizierung der Benutzer und bekommen die Rollen von Flex?

Ich bin mit Spring, Spring Security, BlazeDS, Flex-und Feder-flex.

Ich weiß, dass ich anrufen kann channelSet.login() und channelSet.logout() hook Spring Security für die Authentifizierung. channelSet.authenticated anscheinend kennt nur die aktuelle Flex-Sitzung, wie es immer beginnt als false, bis Sie rufen channelSet.login().

Was ich tun will:

  1. Check von Flex zu wissen, ob ein Benutzer bereits in einer session.
  2. Wenn dem so ist, möchte ich den Benutzernamen und Rollen.

UPDATE

Ich dachte, ich würde hinzufügen, details der Lösung, die ich verwendet, aus brd6644's Antwort unten, so dass dies möglicherweise einfacher für jemand anderes, der sieht dieses. Ich verwendet diese StackOverflow-Antwort, um die SecurityContext injizierbare. Ich werde nicht umschreiben Sie den code aus, dass die Antwort in diesem einen, also gehen Sie es betrachten, für die 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>
Schreibe einen Kommentar