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.Collection; 024import java.util.Collections; 025import java.util.HashSet; 026import java.util.Set; 027 028import org.granite.tide.annotations.TideEnabled; 029import org.springframework.security.authentication.AnonymousAuthenticationToken; 030import org.springframework.security.core.Authentication; 031import org.springframework.security.core.GrantedAuthority; 032import org.springframework.security.core.authority.GrantedAuthorityImpl; 033import org.springframework.security.core.context.SecurityContextHolder; 034import org.springframework.util.StringUtils; 035 036 037/** 038 * @author William DRAI 039 * 040 * Adapted from the Spring security JSP taglib 041 */ 042@TideEnabled 043public class Identity3 { 044 045 public Identity3() { 046 } 047 048 049 public String isLoggedIn() { 050 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 051 if (auth != null && !(auth instanceof AnonymousAuthenticationToken)) 052 return auth.getName(); 053 return null; 054 } 055 056 057 public boolean ifNotGranted(String authorities) { 058 final Collection<GrantedAuthority> granted = getPrincipalAuthorities(); 059 Set<GrantedAuthority> grantedCopy = retainAll(granted, parseAuthoritiesString(authorities)); 060 return grantedCopy.isEmpty(); 061 } 062 063 public boolean ifAllGranted(String authorities) { 064 final Collection<GrantedAuthority> granted = getPrincipalAuthorities(); 065 return granted.containsAll(parseAuthoritiesString(authorities)); 066 } 067 068 public boolean ifAnyGranted(String authorities) { 069 final Collection<GrantedAuthority> granted = getPrincipalAuthorities(); 070 Set<GrantedAuthority> grantedCopy = retainAll(granted, parseAuthoritiesString(authorities)); 071 return !grantedCopy.isEmpty(); 072 } 073 074 private Collection<GrantedAuthority> getPrincipalAuthorities() { 075 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 076 077 if (authentication == null || authentication.getAuthorities() == null) 078 return Collections.emptyList(); 079 080 return authentication.getAuthorities(); 081 } 082 083 private Set<GrantedAuthority> parseAuthoritiesString(String authorizationsString) { 084 final Set<GrantedAuthority> requiredAuthorities = new HashSet<GrantedAuthority>(); 085 final String[] authorities = StringUtils.commaDelimitedListToStringArray(authorizationsString); 086 087 for (int i = 0; i < authorities.length; i++) { 088 String authority = authorities[i]; 089 String role = authority.trim(); 090 role = StringUtils.deleteAny(role, "\t\n\r\f"); 091 092 requiredAuthorities.add(new GrantedAuthorityImpl(role)); 093 } 094 095 return requiredAuthorities; 096 } 097 098 private Set<GrantedAuthority> retainAll(final Collection<GrantedAuthority> granted, final Set<GrantedAuthority> required) { 099 Set<String> grantedRoles = authoritiesToRoles(granted); 100 Set<String> requiredRoles = authoritiesToRoles(required); 101 grantedRoles.retainAll(requiredRoles); 102 103 return rolesToAuthorities(grantedRoles, granted); 104 } 105 106 private Set<String> authoritiesToRoles(Collection<GrantedAuthority> c) { 107 Set<String> roles = new HashSet<String>(); 108 for (GrantedAuthority authority : c) { 109 if (authority.getAuthority() != null) 110 roles.add(authority.getAuthority()); 111 } 112 return roles; 113 } 114 115 private Set<GrantedAuthority> rolesToAuthorities(Set<String> grantedRoles, Collection<GrantedAuthority> granted) { 116 Set<GrantedAuthority> target = new HashSet<GrantedAuthority>(); 117 for (String role : grantedRoles) { 118 for (GrantedAuthority authority : granted) { 119 if (authority.getAuthority().equals(role)) { 120 target.add(authority); 121 break; 122 } 123 } 124 } 125 return target; 126 } 127}