diff --git a/src/main/java/se/su/dsv/scipro/SciProSession.java b/src/main/java/se/su/dsv/scipro/SciProSession.java index e73862f26a..10fd59a2fc 100644 --- a/src/main/java/se/su/dsv/scipro/SciProSession.java +++ b/src/main/java/se/su/dsv/scipro/SciProSession.java @@ -17,6 +17,7 @@ import org.apache.wicket.protocol.http.WebRequest; import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.spring.injection.annot.SpringBean; +import se.su.dsv.scipro.data.dao.interfaces.RoleDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.security.auth.Authenticator; @@ -39,7 +40,8 @@ public class SciProSession extends WebSession { @SpringBean private UserDao userDao; - + @SpringBean + private RoleDao roleDao; private List<Role> roles = new ArrayList<Role>(); private User user = null; @@ -56,7 +58,7 @@ public class SciProSession extends WebSession { this.setLocale(Locale.ENGLISH); else if(cookie.getValue().equals("sv")) this.setLocale(new Locale("sv","SE")); - } + } } @@ -130,24 +132,24 @@ public class SciProSession extends WebSession { * Here we switch the logged in user to be that of the person chosen be the logged in admin */ - if(userDao.isAdmin(user) && loggedInAsUsername != null){ + if(roleDao.isSysadmin(user) && loggedInAsUsername != null){ this.user = userDao.getUserByUsername(loggedInAsUsername); if( user == null) throw new NullPointerException("No user with this username found in the database, despite successful authentication"); } - if(userDao.isStudent(user)){ + if(roleDao.isStudent(user)){ roles.add(new Student()); } - if(userDao.isExternal(user)){ + if(roleDao.isExternal(user)){ roles.add(new External()); } - if(userDao.isEmployee(user)){ + if(roleDao.isEmployee(user)){ roles.add(new Employee()); } - if(userDao.isAdmin(user)){ + if(roleDao.isAdmin(user)){ roles.add(new Admin()); } - if(userDao.isSysadmin(user)){ + if(roleDao.isSysadmin(user)){ roles.add(new SysAdmin()); } diff --git a/src/main/java/se/su/dsv/scipro/basepages/BasePage.java b/src/main/java/se/su/dsv/scipro/basepages/BasePage.java index a596882157..3cf1eabacd 100644 --- a/src/main/java/se/su/dsv/scipro/basepages/BasePage.java +++ b/src/main/java/se/su/dsv/scipro/basepages/BasePage.java @@ -1,10 +1,14 @@ package se.su.dsv.scipro.basepages; +import org.apache.wicket.Component; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.CSSPackageResource; import org.apache.wicket.markup.html.WebPage; import se.su.dsv.scipro.security.auth.Authorization; +import se.su.dsv.scipro.security.auth.ComponentSecurity; +import se.su.dsv.scipro.security.auth.MetaDataActionStrategy; +import se.su.dsv.scipro.security.auth.SecurityFailAction; import se.su.dsv.scipro.security.auth.roles.Roles; @Authorization(requiresLoggedInUser = true, authorizedRoles = {Roles.STUDENT, Roles.ADMIN, Roles.EMPLOYEE, Roles.EXTERNAL, Roles.SYSADMIN}) @@ -33,5 +37,37 @@ public abstract class BasePage extends WebPage { //add(CSSPackageResource.getHeaderContribution("styles/" + GLOBAL_CSS + CSS_SUFFIX)); add(CSSPackageResource.getHeaderContribution("styles/" + css + CSS_SUFFIX)); } + + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + */ + public void authorize(Component component, Roles role){ + MetaDataActionStrategy.authorize(component, role); + } + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + */ + public void authorize(Component component, Roles[] roles){ + MetaDataActionStrategy.authorize(component, roles); + } + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + * removeOnFail = true means the component won't be rendered at all if authorization fails. + * removeOnFail = false means the component will be rendered in a disabled state if authorization fails. + */ + public void authorize(Component component, Roles role, boolean removeOnFail){ + MetaDataActionStrategy.authorize(component, role, removeOnFail); + } + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + * removeOnFail = true means the component won't be rendered at all if authorization fails. + * removeOnFail = false means the component will be rendered in a disabled state if authorization fails. + */ + public void authorize(Component component, Roles[] roles, boolean removeOnFail){ + MetaDataActionStrategy.authorize(component, roles, removeOnFail); + } + + + } \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/RoleDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/RoleDao.java new file mode 100644 index 0000000000..e016e95385 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/RoleDao.java @@ -0,0 +1,18 @@ +package se.su.dsv.scipro.data.dao.interfaces; + +import se.su.dsv.scipro.data.dataobjects.Role; +import se.su.dsv.scipro.data.dataobjects.User; + +public interface RoleDao extends LazyDeleteDao<Role> { + + public boolean isStudent(final User user); + + public boolean isExternal(final User user); + + public boolean isEmployee(final User user); + + public boolean isAdmin(final User user); + + public boolean isSysadmin(final User user); + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java index 6399cab4b9..93491bb644 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java @@ -10,14 +10,4 @@ public interface UserDao extends LazyDeleteDao<User> { public User getUserByEmail(final String emailAddress); - public boolean isStudent(final User user); - - public boolean isExternal(final User user); - - public boolean isEmployee(final User user); - - public boolean isAdmin(final User user); - - public boolean isSysadmin(final User user); - } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/RoleDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/RoleDaoJPAImp.java new file mode 100644 index 0000000000..04b6eca47a --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/RoleDaoJPAImp.java @@ -0,0 +1,95 @@ +package se.su.dsv.scipro.data.dao.jpa; + +import javax.persistence.EntityManager; +import javax.persistence.NoResultException; +import javax.persistence.PersistenceException; +import javax.persistence.TypedQuery; + +import org.springframework.orm.jpa.JpaCallback; +import org.springframework.transaction.annotation.Transactional; + +import se.su.dsv.scipro.data.dao.interfaces.RoleDao; +import se.su.dsv.scipro.data.dataobjects.Role; +import se.su.dsv.scipro.data.dataobjects.User; + + +public class RoleDaoJPAImp extends LazyDeleteAbstractDaoJPAImpl<Role> implements + RoleDao { + + public RoleDaoJPAImp() { + super(Role.class); + } + + @Transactional + public boolean isStudent(final User user) { + return getJpaTemplate().execute(new JpaCallback<Boolean>() { + public Boolean doInJpa(EntityManager em) + throws PersistenceException { + TypedQuery<Role> query = em.createQuery("SELECT s FROM Student s WHERE s.user = :user AND s.deleted = false", Role.class); + query.setParameter("user", user); + try{ + query.getSingleResult(); + return true; + } catch (NoResultException e) { + return false; + } + } + }); + } + @Transactional + public boolean isExternal(final User user) { + return false; //Not implemented + } + + @Transactional + public boolean isEmployee(final User user) { + return getJpaTemplate().execute(new JpaCallback<Boolean>() { + public Boolean doInJpa(EntityManager em) + throws PersistenceException { + TypedQuery<Role> query = em.createQuery("SELECT e FROM Employee e WHERE e.user = :user AND e.deleted = false", Role.class); + query.setParameter("user", user); + try{ + query.getSingleResult(); + return true; + } catch (NoResultException e) { + return false; + } + } + }); + } + + @Transactional + public boolean isAdmin(final User user) { + return getJpaTemplate().execute(new JpaCallback<Boolean>() { + public Boolean doInJpa(EntityManager em) + throws PersistenceException { + TypedQuery<Role> query = em.createQuery("SELECT a FROM Admin a WHERE a.user = :user AND a.deleted = false", Role.class); + query.setParameter("user", user); + try{ + query.getSingleResult(); + return true; + } catch (NoResultException e) { + return false; + } + } + }); + } + + @Transactional + public boolean isSysadmin(final User user) { + return getJpaTemplate().execute(new JpaCallback<Boolean>() { + public Boolean doInJpa(EntityManager em) + throws PersistenceException { + TypedQuery<Role> query = em.createQuery("SELECT sa FROM SysAdmin sa WHERE sa.user = :user AND sa.deleted = false", Role.class); + query.setParameter("user", user); + try{ + query.getSingleResult(); + return true; + } catch (NoResultException e) { + return false; + } + } + }); + } + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java index 77ad4f75fd..f980054707 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java @@ -67,29 +67,4 @@ public class UserDaoJPAImp extends LazyDeleteAbstractDaoJPAImpl<User> implements }); } - public boolean isStudent(final User user) { - // TODO Auto-generated method stub - return true; - } - - public boolean isExternal(final User user) { - // TODO Auto-generated method stub - return false; - } - - public boolean isEmployee(final User user) { - // TODO Auto-generated method stub - return false; - } - - public boolean isAdmin(final User user) { - // TODO Auto-generated method stub - return false; - } - - public boolean isSysadmin(final User user) { - // TODO Auto-generated method stub - return false; - } - } diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Admin.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Admin.java new file mode 100644 index 0000000000..66c4f3b05e --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Admin.java @@ -0,0 +1,20 @@ +package se.su.dsv.scipro.data.dataobjects; + +import javax.persistence.Cacheable; +import javax.persistence.Entity; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * @author Martin Peters - mpeters@se.su.dsv + * + */ +@Entity +@Cacheable(true) +@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) //Hibernate specific +public class Admin extends Role { + + private static final long serialVersionUID = -2570983581219033271L; + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Employee.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Employee.java new file mode 100644 index 0000000000..548fe863f2 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Employee.java @@ -0,0 +1,20 @@ +package se.su.dsv.scipro.data.dataobjects; + +import javax.persistence.Cacheable; +import javax.persistence.Entity; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * @author Martin Peters - mpeters@se.su.dsv + * + */ +@Entity +@Cacheable(true) +@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) //Hibernate specific +public class Employee extends Role { + + private static final long serialVersionUID = -2570983581219033271L; + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Role.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Role.java new file mode 100644 index 0000000000..b9612dd91b --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Role.java @@ -0,0 +1,96 @@ +package se.su.dsv.scipro.data.dataobjects; + +import javax.persistence.DiscriminatorColumn; +import javax.persistence.DiscriminatorType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +@Entity +@DiscriminatorColumn(name = "rolename", discriminatorType = DiscriminatorType.STRING, length = 8) +@Table(name="role", uniqueConstraints={@UniqueConstraint(columnNames={"user_id","rolename"}, name = "role_is_unique")}) +@Inheritance(strategy=InheritanceType.SINGLE_TABLE) +public abstract class Role extends LazyDeletableDomainObject { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Long id; + + @ManyToOne(optional=false) + protected User user; + + /** + * @param id the id to set + */ + public void setId(Long id) { + this.id = id; + } + + /** + * @return the id + */ + public Long getId() { + return id; + } + + /** + * @param user the user to set + */ + public void setUser(User user) { + this.user = user; + } + + /** + * @return the user + */ + public User getUser() { + return user; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((user == null) ? 0 : user.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Role other = (Role) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (user == null) { + if (other.user != null) + return false; + } else if (!user.equals(other.user)) + return false; + return true; + } + + @Override + public String toString() { + String tmp = user.getFirstName() + " " + user.getLastName(); + if(user.getEmailAddress() != null) + tmp = tmp + " (" + user.getEmailAddress() + ")"; + return tmp; + } + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Student.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Student.java new file mode 100644 index 0000000000..ea7b101638 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Student.java @@ -0,0 +1,21 @@ +package se.su.dsv.scipro.data.dataobjects; + +import javax.persistence.Cacheable; +import javax.persistence.Entity; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * @author Martin Peters - mpeters@se.su.dsv + * + */ +@Entity +@Cacheable(true) +@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) //Hibernate specific +public class Student extends Role { + + private static final long serialVersionUID = 6274323425191904206L; + + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/SysAdmin.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/SysAdmin.java new file mode 100644 index 0000000000..2fe75ca39a --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/SysAdmin.java @@ -0,0 +1,21 @@ +package se.su.dsv.scipro.data.dataobjects; + +import javax.persistence.Cacheable; +import javax.persistence.Entity; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * @author Martin Peters - mpeters@se.su.dsv + * + */ +@Entity +@Cacheable(true) +@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) //Hibernate specific +public class SysAdmin extends Role { + + private static final long serialVersionUID = -2570983581219033271L; + + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java index ef7ad0a641..13385de188 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.Set; import javax.persistence.Cacheable; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -40,6 +41,19 @@ public class User extends LazyDeletableDomainObject { @OneToMany(mappedBy="user") private Set<Username> usernames = new HashSet<Username>(); + @OneToMany(mappedBy="user") + private Set<Role> roles = new HashSet<Role>(); + + + public void setRoles(Set<Role> roles) { + this.roles = roles; + } + + public Set<Role> getRoles() { + //Return a copy of the set so no roles can be added into the real collection + return new HashSet<Role>(roles); + } + public Long getId() { return id; } diff --git a/src/main/java/se/su/dsv/scipro/pages/EventPage.java b/src/main/java/se/su/dsv/scipro/pages/EventPage.java index b09dcc3e6f..b43841db22 100644 --- a/src/main/java/se/su/dsv/scipro/pages/EventPage.java +++ b/src/main/java/se/su/dsv/scipro/pages/EventPage.java @@ -6,7 +6,6 @@ import org.apache.wicket.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; @@ -17,15 +16,18 @@ import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.basepages.BasePage; +import se.su.dsv.scipro.basepages.PublicPage; import se.su.dsv.scipro.data.dao.interfaces.EventDao; +import se.su.dsv.scipro.data.dao.interfaces.RoleDao; +import se.su.dsv.scipro.data.dao.interfaces.UserDao; +import se.su.dsv.scipro.data.dataobjects.Admin; import se.su.dsv.scipro.data.dataobjects.Event; -import se.su.dsv.scipro.security.auth.Authorization; -import se.su.dsv.scipro.security.auth.Authorization.ON_AUTH_FAIL; +import se.su.dsv.scipro.data.dataobjects.Student; +import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.security.auth.ComponentSecurity; import se.su.dsv.scipro.security.auth.MetaDataActionStrategy; import se.su.dsv.scipro.security.auth.SecurityFailAction; import se.su.dsv.scipro.security.auth.roles.Roles; -import se.su.dsv.scipro.security.auth.roles.Student; /** * @author Richard Wilkinson - richard.wilkinson@jweekend.com * @@ -34,11 +36,16 @@ public class EventPage extends BasePage { @SpringBean private EventDao eventDao; + @SpringBean + private RoleDao roleDao; + @SpringBean + private UserDao userDao; Form<Event> eventForm; public EventPage(final PageParameters pp) { + eventForm = new Form<Event>("eventForm", new CompoundPropertyModel<Event>(new Event())); eventForm.add(new TextField<String>("title").setRequired(true)); eventForm.add(new TextField<String>("location").setRequired(true)); diff --git a/src/main/java/se/su/dsv/scipro/security/auth/MetaDataActionStrategy.java b/src/main/java/se/su/dsv/scipro/security/auth/MetaDataActionStrategy.java index 0f1963ad34..f085aab8c0 100644 --- a/src/main/java/se/su/dsv/scipro/security/auth/MetaDataActionStrategy.java +++ b/src/main/java/se/su/dsv/scipro/security/auth/MetaDataActionStrategy.java @@ -58,4 +58,50 @@ public class MetaDataActionStrategy implements IAuthorizationStrategy { return true; } + + /* + * Convenience methods for component-based action authorization + */ + + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + */ + public static void authorize(Component component, Roles role){ + ComponentSecurity cs = new ComponentSecurity(role, SecurityFailAction.REMOVE); + component.setMetaData(MetaDataActionStrategy.AUTHORIZED_ROLES, cs ); + } + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + */ + public static void authorize(Component component, Roles[] roles){ + ComponentSecurity cs = new ComponentSecurity(roles, SecurityFailAction.REMOVE); + component.setMetaData(MetaDataActionStrategy.AUTHORIZED_ROLES, cs ); + } + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + * removeOnFail = true means the component won't be rendered at all if authorization fails. + * removeOnFail = false means the component will be rendered in a disabled state if authorization fails. + */ + public static void authorize(Component component, Roles role, boolean removeOnFail){ + ComponentSecurity cs; + if(removeOnFail) + cs = new ComponentSecurity(role, SecurityFailAction.REMOVE); + else + cs = new ComponentSecurity(role, SecurityFailAction.DISABLE); + component.setMetaData(MetaDataActionStrategy.AUTHORIZED_ROLES, cs ); + } + /** + * Convenience method to authorize actions RENDER and ENABLE on a component based on user roles. + * removeOnFail = true means the component won't be rendered at all if authorization fails. + * removeOnFail = false means the component will be rendered in a disabled state if authorization fails. + */ + public static void authorize(Component component, Roles[] roles, boolean removeOnFail){ + ComponentSecurity cs; + if(removeOnFail) + cs = new ComponentSecurity(roles, SecurityFailAction.REMOVE); + else + cs = new ComponentSecurity(roles, SecurityFailAction.DISABLE); + component.setMetaData(MetaDataActionStrategy.AUTHORIZED_ROLES, cs ); + } + } diff --git a/src/main/java/se/su/dsv/scipro/security/auth/RoleBasedAuthorizationStrategy.java b/src/main/java/se/su/dsv/scipro/security/auth/RoleBasedAuthorizationStrategy.java index b9d402e90c..9621c65762 100644 --- a/src/main/java/se/su/dsv/scipro/security/auth/RoleBasedAuthorizationStrategy.java +++ b/src/main/java/se/su/dsv/scipro/security/auth/RoleBasedAuthorizationStrategy.java @@ -1,6 +1,7 @@ package se.su.dsv.scipro.security.auth; import org.apache.wicket.Component; +import org.apache.wicket.RequestCycle; import org.apache.wicket.RestartResponseAtInterceptPageException; import org.apache.wicket.authorization.Action; import org.apache.wicket.authorization.IAuthorizationStrategy; @@ -66,12 +67,12 @@ public class RoleBasedAuthorizationStrategy implements IAuthorizationStrategy { }//There was an annotation present //TODO: Remove this println - System.out.println("RoleBasedAuthorisationStrategy says authorized: "+ok+" for action "+action.getName()+" on component "+component.getClass()); + //System.out.println("RoleBasedAuthorisationStrategy says authorized: "+ok+" for action "+action.getName()+" on component "+component.getClass()); return ok; } - public <T extends Component> boolean isInstantiationAuthorized(Class<T> componentClass) { - + public <T extends Component> boolean isInstantiationAuthorized(Class<T> componentClass) { + //Not annotated classes aren't checked further Authorization annotation = (Authorization) componentClass.getAnnotation(Authorization.class); if (annotation != null) { diff --git a/src/main/java/se/su/dsv/scipro/security/auth/SciProSAMLUserDetailsService.java b/src/main/java/se/su/dsv/scipro/security/auth/SciProSAMLUserDetailsService.java new file mode 100644 index 0000000000..c4546b43ec --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/security/auth/SciProSAMLUserDetailsService.java @@ -0,0 +1,82 @@ +package se.su.dsv.scipro.security.auth; +/* +import org.opensaml.saml2.core.Attribute; +import org.opensaml.xml.XMLObject; +import org.opensaml.xml.schema.XSString; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.saml.SAMLCredential; +import org.springframework.security.saml.userdetails.SAMLUserDetailsService; + +import se.su.dsv.daisy.model.authorisation.LoginCredentials; +import se.su.dsv.daisy.security.authorization.Permission; +import se.su.dsv.daisy.service.AuthorizationService; +import se.su.dsv.daisy.service.LoginCredentialsService; +*/ +import javax.annotation.Resource; +import java.util.HashSet; + +/** + * Created by IntelliJ IDEA. + * User: herder + * Date: 2010-jun-14 + * Time: 16:41:13 + */ +public abstract class SciProSAMLUserDetailsService {//implements SAMLUserDetailsService { + + + private String principalNameKey; + /* + @Resource + private LoginCredentialsService service; + + @Resource + private AuthorizationService authorizationService; + + public void setPrincipalNameKey(String uidKey) { + this.principalNameKey = uidKey; + } + + @Override + public UserDetails loadUserBySAML(SAMLCredential credential) throws UsernameNotFoundException { + System.out.println("SAMLLOADUSERCALLED"); + Attribute attribute = credential.getAttributeByName(principalNameKey); + for (XMLObject xmlObject : attribute.getAttributeValues()) { + if (xmlObject instanceof XSString) { + XSString xsString = (XSString) xmlObject; + System.out.println(xsString); + + String[] strings = xsString.getValue().split("@"); + if (strings.length >= 2) { + final String username = strings[0]; + final String realm = strings[1]; + LoginCredentials loginCredentials = service.getLoginCredentials(username, realm); + if (loginCredentials != null) { + final HashSet<GrantedAuthority> hashSet = new HashSet<GrantedAuthority>(); + if (authorizationService.isAuthorized(loginCredentials.getId(), null, Permission.SYSADMIN)) { + hashSet.add(new GrantedAuthority() { + @Override + public String getAuthority() { + return "ROLE_ADMIN"; + } + }); + } + hashSet.add(new GrantedAuthority() { + @Override + public String getAuthority() { + return "ROLE_USER"; + } + }); + return new DaisyUser(loginCredentials.getPerson().getId(), loginCredentials.getUsername(), loginCredentials.getUsername(), loginCredentials.isEnabled(), false, !loginCredentials.isExpired(), !loginCredentials.isLocked(), hashSet); + } + return new UnknownUser(username, "****", false, true, true, false, new HashSet<GrantedAuthority>()); + } + + } + } + throw new UsernameNotFoundException("User not found: " + attribute.getAttributeValues()); + } + */ +}