Uso Spring, Spring Security, BlazeDS, Flex e Spring-flex.Come posso verificare Spring Security per l'autenticazione dell'utente e ottenere ruoli da Flex?
So che posso chiamare channelSet.login()
e channelSet.logout()
per connettersi a Spring Security per l'autenticazione. channelSet.authenticated
a quanto pare conosce solo la sessione Flex attuale, poiché inizia sempre come false, fino a quando non si chiama channelSet.login()
.
quello che voglio fare:
- Controllare da Flex per sapere se un utente è già in una sessione.
- Se è così, voglio il loro nome utente e ruoli.
UPDATE
Ho solo pensato che vorrei aggiungere dettagli della soluzione che ho usato dalla risposta brd6644 s' al di sotto, in modo che questo potrebbe essere più facile per qualcun altro che guarda questo. Ho usato la risposta StackOverflow this per rendere l'iniettabile SecurityContext
. Non sto riscrivendo il codice da quella risposta in questo, quindi dai un'occhiata allo 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>
Questo era MOLTO meglio di quello che stavo succedendo.Ha funzionato molto bene e ha salvato un sacco di codice. –