Commit b80955bc by Tuomas Riihimäki

Access control fixing to work with JAAS

1 parent 95fda792
...@@ -29,7 +29,7 @@ import fi.insomnia.bortal.model.User; ...@@ -29,7 +29,7 @@ import fi.insomnia.bortal.model.User;
*/ */
@Stateless @Stateless
@DeclareRoles("admin") @DeclareRoles("admin")
public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandlerBeanRemote{ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandlerBeanRemote {
private static final Logger logger = LoggerFactory.getLogger(SessionHandlerBean.class); private static final Logger logger = LoggerFactory.getLogger(SessionHandlerBean.class);
@EJB @EJB
...@@ -38,10 +38,12 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl ...@@ -38,10 +38,12 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl
private AccessRightFacade accessRightFacade; private AccessRightFacade accessRightFacade;
@EJB @EJB
private RoleFacade roleFacade; private RoleFacade roleFacade;
@Resource @Resource
SessionContext context; private SessionContext context;
@EJB
private UserBean userbean;
/** /**
* Default constructor. * Default constructor.
*/ */
...@@ -52,17 +54,20 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl ...@@ -52,17 +54,20 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl
@Override @Override
public boolean hasPermission(String target, User user, RolePermission permission) { public boolean hasPermission(String target, User user, RolePermission permission) {
if (user == null) {
return false;
}
AccessRight expectedRight = accessRightFacade.findOrCreateByName(target); AccessRight expectedRight = accessRightFacade.findOrCreateByName(target);
User dbusr = userfacade.find(user.getId()); User dbusr = userfacade.find(user.getId());
Set<Role> checkedRoles = new HashSet<Role>(); if (dbusr != null) {
for (Role r : dbusr.getRoles()) { Set<Role> checkedRoles = new HashSet<Role>();
if (getRights(r, expectedRight, permission, checkedRoles)) { for (Role r : dbusr.getRoles()) {
return true; if (getRights(r, expectedRight, permission, checkedRoles)) {
return true;
}
} }
} }
return false; return false;
} }
...@@ -129,17 +134,9 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl ...@@ -129,17 +134,9 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl
return defaultUser; return defaultUser;
} }
public void testing()
{
Principal principal = context.getCallerPrincipal();
logger.warn("principal {}",principal.getName());
logger.warn("Principal in admin: {}",context.isCallerInRole("admin"));
}
@Override @Override
public boolean authenticate(String username, String password) { public boolean authenticate(String username, String password) {
return (tryLogin(username,password) != null); return (tryLogin(username, password) != null);
} }
@Override @Override
...@@ -151,7 +148,12 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl ...@@ -151,7 +148,12 @@ public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandl
@Override @Override
public User getCurrentUser() { public User getCurrentUser() {
// TODO Auto-generated method stub Principal principal = context.getCallerPrincipal();
return null; User ret = userbean.getUser(principal.getName());
if (ret == null)
{
ret = getDefaultUser();
}
return ret;
} }
} }
...@@ -26,9 +26,10 @@ public class AccessRightFacade extends IntegerPkGenericFacade<AccessRight> { ...@@ -26,9 +26,10 @@ public class AccessRightFacade extends IntegerPkGenericFacade<AccessRight> {
public AccessRight findOrCreateByName(String target) { public AccessRight findOrCreateByName(String target) {
// Fetch access right by name // Fetch access right by name
TypedQuery<AccessRight> q = em.createNamedQuery("AccessRight.findByName", AccessRight.class); TypedQuery<AccessRight> q = em.createQuery("SELECT a FROM AccessRight a WHERE a.name = :name", AccessRight.class);
q.setParameter("name", target); q.setParameter("name", target);
AccessRight right = q.getSingleResult(); AccessRight right = null;
right = this.getSingleNullableResult(q);
// Might not exist yet -> create // Might not exist yet -> create
if (right == null) { if (right == null) {
......
...@@ -3,6 +3,7 @@ package fi.insomnia.bortal.facade; ...@@ -3,6 +3,7 @@ package fi.insomnia.bortal.facade;
import java.util.List; import java.util.List;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
...@@ -66,5 +67,15 @@ public abstract class GenericFacade<PK,T extends ModelInterface<PK>> implements ...@@ -66,5 +67,15 @@ public abstract class GenericFacade<PK,T extends ModelInterface<PK>> implements
TypedQuery<Long> q = getEm().createQuery(cq); TypedQuery<Long> q = getEm().createQuery(cq);
return q.getSingleResult(); return q.getSingleResult();
} }
protected T getSingleNullableResult(TypedQuery<T> q) {
T ret = null;
try {
ret = q.getSingleResult();
} catch (NoResultException e) {
ret = null;
}
return ret;
}
} }
...@@ -5,13 +5,13 @@ import fi.insomnia.bortal.model.ModelInterface; ...@@ -5,13 +5,13 @@ import fi.insomnia.bortal.model.ModelInterface;
/** /**
* Session Bean implementation class GenericFacade * Session Bean implementation class GenericFacade
*/ */
public abstract class IntegerPkGenericFacade<T extends ModelInterface<Integer>> extends GenericFacade<Integer,T> { public abstract class IntegerPkGenericFacade<T extends ModelInterface<Integer>> extends GenericFacade<Integer, T> {
public IntegerPkGenericFacade(Class<T> entityClass) { public IntegerPkGenericFacade(Class<T> entityClass) {
super(entityClass); super(entityClass);
}
}
} }
...@@ -25,9 +25,9 @@ public class RoleFacade extends EventChildGenericFacade<Role> { ...@@ -25,9 +25,9 @@ public class RoleFacade extends EventChildGenericFacade<Role> {
} }
public Role findByName(String name) { public Role findByName(String name) {
TypedQuery<Role> q = em.createNamedQuery("User.findByName", Role.class); TypedQuery<Role> q = em.createNamedQuery("Role.findByRoleName", Role.class);
q.setParameter("name", name); q.setParameter("name", name);
return q.getSingleResult(); return this.getSingleNullableResult(q);
} }
public Role getOrCreatePublicRole() { public Role getOrCreatePublicRole() {
......
...@@ -12,7 +12,7 @@ import fi.insomnia.bortal.model.User; ...@@ -12,7 +12,7 @@ import fi.insomnia.bortal.model.User;
@LocalBean @LocalBean
public class UserFacade extends IntegerPkGenericFacade<User> { public class UserFacade extends IntegerPkGenericFacade<User> {
public static final String DEFAULT_USER_LOGIN = "default"; public static final String DEFAULT_USER_LOGIN = "ANONYMOUS";
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
...@@ -32,9 +32,10 @@ public class UserFacade extends IntegerPkGenericFacade<User> { ...@@ -32,9 +32,10 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
// return q.getSingleResult(); // return q.getSingleResult();
TypedQuery<User> q = em.createQuery("SELECT u FROM User u WHERE u.login = :login", User.class); TypedQuery<User> q = em.createQuery("SELECT u FROM User u WHERE u.login = :login", User.class);
q.setParameter("login", login); q.setParameter("login", login);
return (User) q.getSingleResult(); return getSingleNullableResult(q);
} }
public User getOrCreateDefaultUser() { public User getOrCreateDefaultUser() {
User defaultUser = findByLogin(DEFAULT_USER_LOGIN); User defaultUser = findByLogin(DEFAULT_USER_LOGIN);
......
...@@ -9,10 +9,7 @@ public interface SessionHandlerBeanLocal { ...@@ -9,10 +9,7 @@ public interface SessionHandlerBeanLocal {
boolean hasPermission(String target, User user, RolePermission permission); boolean hasPermission(String target, User user, RolePermission permission);
User getDefaultUser(); User getDefaultUser();
void testing();
User getCurrentUser(); User getCurrentUser();
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!