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