001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package org.granite.tide.spring.security;
022
023import java.util.Arrays;
024import java.util.Collection;
025import java.util.Collections;
026import java.util.HashSet;
027import java.util.Set;
028
029import org.granite.tide.annotations.TideEnabled;
030import org.springframework.security.Authentication;
031import org.springframework.security.GrantedAuthority;
032import org.springframework.security.GrantedAuthorityImpl;
033import org.springframework.security.context.SecurityContextHolder;
034import org.springframework.security.providers.anonymous.AnonymousAuthenticationToken;
035import org.springframework.util.StringUtils;
036
037
038/**
039 *      @author William DRAI
040 * 
041 *      Adapted from the Spring security JSP taglib
042 */
043@TideEnabled
044public class Identity {
045        
046    public Identity() {
047    }
048    
049    
050    public String isLoggedIn() {
051        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
052        if (auth != null && !(auth instanceof AnonymousAuthenticationToken))
053                return auth.getName();
054        return null;
055    }
056    
057    
058    public boolean ifNotGranted(String authorities) {
059        final Collection<GrantedAuthority> granted = getPrincipalAuthorities();
060        Set<GrantedAuthority> grantedCopy = retainAll(granted, parseAuthoritiesString(authorities));
061        return grantedCopy.isEmpty();
062    }
063    
064    public boolean ifAllGranted(String authorities) {
065        final Collection<GrantedAuthority> granted = getPrincipalAuthorities();
066        return granted.containsAll(parseAuthoritiesString(authorities));
067    }
068    
069    public boolean ifAnyGranted(String authorities) {
070        final Collection<GrantedAuthority> granted = getPrincipalAuthorities();
071        Set<GrantedAuthority> grantedCopy = retainAll(granted, parseAuthoritiesString(authorities));
072        return !grantedCopy.isEmpty();
073    }
074
075    private Collection<GrantedAuthority> getPrincipalAuthorities() {
076        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
077
078        if (authentication == null || authentication.getAuthorities() == null)
079            return Collections.emptyList();
080
081        return Arrays.asList(authentication.getAuthorities());
082    }
083
084    private Set<GrantedAuthority> parseAuthoritiesString(String authorizationsString) {
085        final Set<GrantedAuthority> requiredAuthorities = new HashSet<GrantedAuthority>();
086        final String[] authorities = StringUtils.commaDelimitedListToStringArray(authorizationsString);
087
088        for (int i = 0; i < authorities.length; i++) {
089            String authority = authorities[i];
090            String role = authority.trim();
091            role = StringUtils.deleteAny(role, "\t\n\r\f");
092
093            requiredAuthorities.add(new GrantedAuthorityImpl(role));
094        }
095
096        return requiredAuthorities;
097    }
098
099    private Set<GrantedAuthority> retainAll(final Collection<GrantedAuthority> granted, final Set<GrantedAuthority> required) {
100        Set<String> grantedRoles = authoritiesToRoles(granted);
101        Set<String> requiredRoles = authoritiesToRoles(required);
102        grantedRoles.retainAll(requiredRoles);
103
104        return rolesToAuthorities(grantedRoles, granted);
105    }
106
107    private Set<String> authoritiesToRoles(Collection<GrantedAuthority> c) {
108        Set<String> roles = new HashSet<String>();
109        for (GrantedAuthority authority : c) {
110            if (authority.getAuthority() != null)
111                    roles.add(authority.getAuthority());
112        }
113        return roles;
114    }
115
116    private Set<GrantedAuthority> rolesToAuthorities(Set<String> grantedRoles, Collection<GrantedAuthority> granted) {
117        Set<GrantedAuthority> target = new HashSet<GrantedAuthority>();
118        for (String role : grantedRoles) {
119            for (GrantedAuthority authority : granted) {
120                if (authority.getAuthority().equals(role)) {
121                    target.add(authority);
122                    break;
123                }
124            }
125        }
126        return target;
127    }
128}