]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - OsAuthenticationToken.java
9fba6f054aa482fc52dcfee7435a5f50f862d4f6
1 package org
.argeo
.security
;
3 import java
.security
.AccessController
;
4 import java
.security
.Principal
;
5 import java
.util
.ArrayList
;
6 import java
.util
.Arrays
;
7 import java
.util
.Collections
;
11 import javax
.security
.auth
.Subject
;
13 import org
.argeo
.ArgeoException
;
14 import org
.argeo
.OperatingSystem
;
15 import org
.springframework
.security
.Authentication
;
16 import org
.springframework
.security
.GrantedAuthority
;
17 import org
.springframework
.security
.GrantedAuthorityImpl
;
18 import org
.springframework
.security
.userdetails
.UserDetails
;
20 /** Abstracts principals provided by com.sun.security.auth.module login modules. */
21 public class OsAuthenticationToken
implements Authentication
{
22 private static final long serialVersionUID
= -7544626794250917244L;
24 final Class
<?
extends Principal
> osUserPrincipalClass
;
25 final Class
<?
extends Principal
> osUserIdPrincipalClass
;
26 final Class
<?
extends Principal
> osGroupIdPrincipalClass
;
28 private List
<GrantedAuthority
> grantedAuthorities
;
30 private UserDetails details
;
33 public OsAuthenticationToken(GrantedAuthority
[] grantedAuthorities
) {
34 this.grantedAuthorities
= grantedAuthorities
!= null ? Arrays
35 .asList(grantedAuthorities
) : null;
36 ClassLoader cl
= getClass().getClassLoader();
37 switch (OperatingSystem
.os
) {
38 case OperatingSystem
.WINDOWS
:
39 osUserPrincipalClass
= getPrincipalClass(cl
,
40 "com.sun.security.auth.NTUserPrincipal");
41 osUserIdPrincipalClass
= getPrincipalClass(cl
,
42 "com.sun.security.auth.NTSidUserPrincipal");
43 osGroupIdPrincipalClass
= getPrincipalClass(cl
,
44 "com.sun.security.auth.NTSidGroupPrincipal");
46 case OperatingSystem
.NIX
:
47 osUserPrincipalClass
= getPrincipalClass(cl
,
48 "com.sun.security.auth.UnixPrincipal");
49 osUserIdPrincipalClass
= getPrincipalClass(cl
,
50 "com.sun.security.auth.UnixNumericUserPrincipal");
51 osGroupIdPrincipalClass
= getPrincipalClass(cl
,
52 "com.sun.security.auth.UnixNumericGroupPrincipal");
54 case OperatingSystem
.SOLARIS
:
55 osUserPrincipalClass
= getPrincipalClass(cl
,
56 "com.sun.security.auth.SolarisPrincipal");
57 osUserIdPrincipalClass
= getPrincipalClass(cl
,
58 "com.sun.security.auth.SolarisNumericUserPrincipal");
59 osGroupIdPrincipalClass
= getPrincipalClass(cl
,
60 "com.sun.security.auth.SolarisNumericGroupPrincipal");
64 throw new ArgeoException("Unsupported operating system "
65 + OperatingSystem
.os
);
71 public OsAuthenticationToken() {
75 public String
getName() {
76 return getUser().getName();
79 public GrantedAuthority
[] getAuthorities() {
80 // grantedAuthorities should not be null at this stage
81 List
<GrantedAuthority
> gas
= new ArrayList
<GrantedAuthority
>(
83 for (Principal groupPrincipal
: getGroupsIds()) {
84 gas
.add(new GrantedAuthorityImpl("OSGROUP_"
85 + groupPrincipal
.getName()));
87 return gas
.toArray(new GrantedAuthority
[gas
.size()]);
90 public UserDetails
getDetails() {
94 public void setDetails(UserDetails details
) {
95 this.details
= details
;
98 public boolean isAuthenticated() {
99 return grantedAuthorities
!= null;
102 public void setAuthenticated(boolean isAuthenticated
)
103 throws IllegalArgumentException
{
104 if (grantedAuthorities
!= null)
105 grantedAuthorities
.clear();
106 grantedAuthorities
= null;
109 @SuppressWarnings("unchecked")
110 protected static Class
<?
extends Principal
> getPrincipalClass(
111 ClassLoader cl
, String className
) {
113 return (Class
<?
extends Principal
>) cl
.loadClass(className
);
114 } catch (ClassNotFoundException e
) {
115 throw new ArgeoException("Cannot load principal class", e
);
119 public Object
getPrincipal() {
123 public Principal
getUser() {
124 Subject subject
= Subject
.getSubject(AccessController
.getContext());
125 Set
<?
extends Principal
> userPrincipals
= subject
126 .getPrincipals(osUserPrincipalClass
);
127 if (userPrincipals
== null || userPrincipals
.size() == 0)
128 throw new ArgeoException("No OS principal");
129 if (userPrincipals
.size() > 1)
130 throw new ArgeoException("More than one OS principal");
131 Principal user
= userPrincipals
.iterator().next();
135 public Principal
getUserId() {
136 Subject subject
= Subject
.getSubject(AccessController
.getContext());
137 Set
<?
extends Principal
> userIdsPrincipals
= subject
138 .getPrincipals(osUserIdPrincipalClass
);
139 if (userIdsPrincipals
== null || userIdsPrincipals
.size() == 0)
140 throw new ArgeoException("No user id principal");
141 if (userIdsPrincipals
.size() > 1)
142 throw new ArgeoException("More than one user id principal");
143 Principal userId
= userIdsPrincipals
.iterator().next();
147 public Set
<?
extends Principal
> getGroupsIds() {
148 Subject subject
= Subject
.getSubject(AccessController
.getContext());
149 return (Set
<?
extends Principal
>) subject
150 .getPrincipals(osGroupIdPrincipalClass
);
153 public Object
getCredentials() {