Hi All!
I've written very simple work around for this. I use session backing
bean: AuthorizationController to store user and his/hers roles and
AuthorizationPhaseListener to retrieve the roles and users from the
original request.
This is how it looks like:
public class AuthorizationPhaseListener implements PhaseListener {
private static final long serialVersionUID = 2078973126942159155L;
protected final static Logger logger = Logger
.getLogger(AuthorizationPhaseListener.class);
@SuppressWarnings("deprecation")
public void afterPhase(PhaseEvent phaseEvent) {
FacesContext facesContext = phaseEvent.getFacesContext();
// check if user has been authorized by JAAS, if not return
if (facesContext.getExternalContext().getRemoteUser() == null) {
return;
}
// there is a remote user set by JAAS
// MyFaces 1.2.2 security bug, cannot retrieve managed bean
because it
// erases all roles, copy them before ;)
Map<String, Boolean> rolesMap = new HashMap<String, Boolean>(4);
String[] roles = new String[] { "viewer", "executor", "creator",
"admin" };
for (String role : roles) {
logger.debug("Is user in '"
+ role
+ "' role? ==> "
+
phaseEvent.getFacesContext().getExternalContext()
.isUserInRole(role));
rolesMap.put(role, phaseEvent.getFacesContext()
.getExternalContext().isUserInRole(role));
}
AuthorizationController authorizationController =
(AuthorizationController) facesContext
.getApplication().createValueBinding(
"#{AuthorizationController}").getValue(facesContext);
logger.debug("Remote user is ==> "
+
facesContext.getExternalContext().getRemoteUser());
logger.debug("Authorized user is ==> "
+ authorizationController.getUser());
// if user is already authorized, return
if (authorizationController.getUser() != null
&&
facesContext.getExternalContext().getRemoteUser() != null) {
return;
}
// if not, proceed
// load user
authorizationController.loadUser(facesContext.getExternalContext()
.getRemoteUser());
// and set proper roles
for (String role : rolesMap.keySet()) {
if (rolesMap.get(role)) {
authorizationController.setRole(role);
}
}
}
public void beforePhase(PhaseEvent phaseEvent) {
}
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
now, inside any view I can now user for example
rendered="#{AuthorizationController.admin}"
best regards
Łukasz
On 12/03/2008, Łukasz Budnik <[EMAIL PROTECTED]> wrote:
> Hi All!
>
> I had some trouble with Tomahawk's visibleOnUserRole.
> Also, I've tried the securityContext from Tomahawk Sandbox, but it
> didn't work either.
>
> I've written simple tests, in every case I use following array of roles:
>
> String[] roles = new String[] { "viewer", "executor", "creator", "admin" };
>
> inside TestFilter.doFilter I have:
>
> for (String role : roles) {
> logger.debug("Is user in '" + role + "' role? ==> "
> + ((HttpServletRequest) request).isUserInRole(role));
> }
>
> inside TestPhaseListener.afterPhase/beforePhase:
>
> for (String role : roles) {
> logger.debug("**after/before** phase Is user in '" + role + "' role?
> ==> "
> +
> phaseEvent.getFacesContext().getExternalContext().isUserInRole(role));
> }
>
> and finally inside TestBackingBean I have two loops:
>
> for (String role : roles) {
> logger.debug("Is user in '" + role + "' role? ==> "
> +
> FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role));
> }
> for (String role : roles) {
> logger.debug("Is user in '" + role + "' role? ==> "
> + ( (HttpServletRequest)
>
> FacesContext.getCurrentInstance().getExternalContext().getRequest()).isUserInRole(role));
> }
>
> after successful signing in, I browse a random page, and here's what I
> see in my log:
>
> first control flow goes to the filter:
>
> 01:27:28,000 DEBUG [TestFilter] Is user in 'viewer' role? ==> true
> 01:27:28,000 DEBUG [TestFilter] Is user in 'executor' role? ==> true
> 01:27:28,000 DEBUG [TestFilter] Is user in 'creator' role? ==> true
> 01:27:28,000 DEBUG [TestFilter] Is user in 'admin' role? ==> true
>
> as expected ;)
>
> now, MyFaces beforePhase:
>
> 01:27:28,015 DEBUG [TestPhaseListener] before phase Is user in
> 'viewer' role? ==> true
> 01:27:28,015 DEBUG [TestPhaseListener] before phase Is user in
> 'executor' role? ==> true
> 01:27:28,015 DEBUG [TestPhaseListener] before phase Is user in
> 'creator' role? ==> true
> 01:27:28,015 DEBUG [TestPhaseListener] before phase Is user in 'admin'
> role? ==> true
>
> perfect!
>
> and afterPhase:
>
> 01:27:28,015 DEBUG [TestPhaseListener] after phase Is user in 'viewer'
> role? ==> true
> 01:27:28,015 DEBUG [TestPhaseListener] after phase Is user in
> 'executor' role? ==> true
> 01:27:28,015 DEBUG [TestPhaseListener] after phase Is user in
> 'creator' role? ==> true
> 01:27:28,015 DEBUG [TestPhaseListener] after phase Is user in 'admin'
> role? ==> true
>
> couldn't be better!
>
>
> BUT ;(
>
> inside the backing bean:
>
> 01:27:28,171 DEBUG [TestBackingBean] Is user in 'viewer' role? ==> false
> 01:27:28,171 DEBUG [TestBackingBean] Is user in 'executor' role? ==> false
> 01:27:28,171 DEBUG [TestBackingBean] Is user in 'creator' role? ==> false
> 01:27:28,171 DEBUG [TestBackingBean] Is user in 'admin' role? ==> false
> 01:27:28,187 DEBUG [TestBackingBean] Is user in 'viewer' role? ==> false
> 01:27:28,187 DEBUG [TestBackingBean] Is user in 'executor' role? ==> false
> 01:27:28,187 DEBUG [TestBackingBean] Is user in 'creator' role? ==> false
> 01:27:28,187 DEBUG [TestBackingBean] Is user in 'admin' role? ==> false
>
> disaster!
>
> security in MyFaces 1.2.2 does not work at all (except for phase
> listeners, which is useless for me anyway).
>
> any idea how to fix it?
>
> best regards
>
> Łukasz
>