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()
và 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:
- Kiểm tra từ Flex biết nếu người dùng đã có trong một phiên làm việc.
- 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>
Đ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ã. –