Skip to content

Commit

Permalink
LoginContext#authorize takes lambda instead Token
Browse files Browse the repository at this point in the history
There was a circular dependency in that we need a securityContext for
property level security in
  • Loading branch information
pontusmelke committed Mar 2, 2018
1 parent a1c3b30 commit 90d31ed
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 31 deletions.
Expand Up @@ -19,11 +19,11 @@
*/ */
package org.neo4j.internal.kernel.api.security; package org.neo4j.internal.kernel.api.security;


import org.neo4j.internal.kernel.api.Token; import java.util.function.Function;


/** /**
* The LoginContext hold the executing authenticated user (subject). * The LoginContext hold the executing authenticated user (subject).
* By calling {@link #authorize(Token)} the user is also authorized, and a full SecurityContext is returned, * By calling {@link #authorize(Function<String,Integer>)} the user is also authorized, and a full SecurityContext is returned,
* which can be used to assert user permissions during query execution. * which can be used to assert user permissions during query execution.
*/ */
public interface LoginContext public interface LoginContext
Expand All @@ -36,10 +36,10 @@ public interface LoginContext
/** /**
* Authorize the user and return a SecurityContext. * Authorize the user and return a SecurityContext.
* *
* @param token token lookup, used to compile property level security verification * @param tokenLookup token lookup, used to compile property level security verification
* @return the security context * @return the security context
*/ */
SecurityContext authorize( Token token ); SecurityContext authorize( Function<String, Integer> tokenLookup );


LoginContext AUTH_DISABLED = new LoginContext() LoginContext AUTH_DISABLED = new LoginContext()
{ {
Expand All @@ -50,7 +50,7 @@ public AuthSubject subject()
} }


@Override @Override
public SecurityContext authorize( Token token ) public SecurityContext authorize( Function<String, Integer> tokenLookup )
{ {
return SecurityContext.AUTH_DISABLED; return SecurityContext.AUTH_DISABLED;
} }
Expand Down
Expand Up @@ -19,7 +19,7 @@
*/ */
package org.neo4j.internal.kernel.api.security; package org.neo4j.internal.kernel.api.security;


import org.neo4j.internal.kernel.api.Token; import java.util.function.Function;


import static org.neo4j.graphdb.security.AuthorizationViolationException.PERMISSION_DENIED; import static org.neo4j.graphdb.security.AuthorizationViolationException.PERMISSION_DENIED;


Expand Down Expand Up @@ -62,7 +62,7 @@ public AuthSubject subject()
} }


@Override @Override
public SecurityContext authorize( Token token ) public SecurityContext authorize( Function<String, Integer> tokenLookup )
{ {
return this; return this;
} }
Expand Down
Expand Up @@ -19,7 +19,8 @@
*/ */
package org.neo4j.kernel.api.security; package org.neo4j.kernel.api.security;


import org.neo4j.internal.kernel.api.Token; import java.util.function.Function;

import org.neo4j.internal.kernel.api.security.AccessMode; import org.neo4j.internal.kernel.api.security.AccessMode;
import org.neo4j.internal.kernel.api.security.AuthSubject; import org.neo4j.internal.kernel.api.security.AuthSubject;
import org.neo4j.internal.kernel.api.security.LoginContext; import org.neo4j.internal.kernel.api.security.LoginContext;
Expand Down Expand Up @@ -67,7 +68,7 @@ public AuthSubject subject()
} }


@Override @Override
public SecurityContext authorize( Token token ) public SecurityContext authorize( Function<String, Integer> tokenLookup )
{ {
return new SecurityContext( subject(), accessMode ); return new SecurityContext( subject(), accessMode );
} }
Expand Down
Expand Up @@ -19,7 +19,8 @@
*/ */
package org.neo4j.server.security.auth; package org.neo4j.server.security.auth;


import org.neo4j.internal.kernel.api.Token; import java.util.function.Function;

import org.neo4j.internal.kernel.api.security.AccessMode; import org.neo4j.internal.kernel.api.security.AccessMode;
import org.neo4j.internal.kernel.api.security.AuthSubject; import org.neo4j.internal.kernel.api.security.AuthSubject;
import org.neo4j.internal.kernel.api.security.AuthenticationResult; import org.neo4j.internal.kernel.api.security.AuthenticationResult;
Expand Down Expand Up @@ -107,7 +108,7 @@ public AuthSubject subject()
} }


@Override @Override
public SecurityContext authorize( Token token ) public SecurityContext authorize( Function<String, Integer> tokenLookup )
{ {
return new SecurityContext( authSubject, accessMode ); return new SecurityContext( authSubject, accessMode );
} }
Expand Down
Expand Up @@ -21,16 +21,16 @@


import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
import java.util.function.Function;


import org.neo4j.internal.kernel.api.Token;
import org.neo4j.internal.kernel.api.security.AuthSubject; import org.neo4j.internal.kernel.api.security.AuthSubject;
import org.neo4j.internal.kernel.api.security.LoginContext; import org.neo4j.internal.kernel.api.security.LoginContext;


public interface EnterpriseLoginContext extends LoginContext public interface EnterpriseLoginContext extends LoginContext
{ {
Set<String> roles(); Set<String> roles();


EnterpriseSecurityContext authorize( Token token ); EnterpriseSecurityContext authorize( Function<String, Integer> tokenLookup );


EnterpriseLoginContext AUTH_DISABLED = new EnterpriseLoginContext() EnterpriseLoginContext AUTH_DISABLED = new EnterpriseLoginContext()
{ {
Expand All @@ -47,7 +47,7 @@ public Set<String> roles()
} }


@Override @Override
public EnterpriseSecurityContext authorize( Token token ) public EnterpriseSecurityContext authorize( Function<String, Integer> tokenLookup )
{ {
return EnterpriseSecurityContext.AUTH_DISABLED; return EnterpriseSecurityContext.AUTH_DISABLED;
} }
Expand Down
Expand Up @@ -50,8 +50,6 @@
import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveIntSet;
import org.neo4j.graphdb.security.AuthProviderFailedException; import org.neo4j.graphdb.security.AuthProviderFailedException;
import org.neo4j.graphdb.security.AuthProviderTimeoutException; import org.neo4j.graphdb.security.AuthProviderTimeoutException;
import org.neo4j.internal.kernel.api.Token;
import org.neo4j.internal.kernel.api.exceptions.schema.IllegalTokenNameException;
import org.neo4j.internal.kernel.api.security.AuthSubject; import org.neo4j.internal.kernel.api.security.AuthSubject;
import org.neo4j.internal.kernel.api.security.AuthenticationResult; import org.neo4j.internal.kernel.api.security.AuthenticationResult;
import org.neo4j.kernel.api.security.exception.InvalidAuthTokenException; import org.neo4j.kernel.api.security.exception.InvalidAuthTokenException;
Expand Down Expand Up @@ -309,7 +307,7 @@ public Collection<AuthorizationInfo> getAuthorizationInfo( PrincipalCollection p
return infoList; return infoList;
} }


IntPredicate getPropertyPermissions( Set<String> roles, Token token ) IntPredicate getPropertyPermissions( Set<String> roles, Function<String, Integer> tokenLookup )
{ {
if ( propertyAuthorization ) if ( propertyAuthorization )
{ {
Expand All @@ -324,11 +322,10 @@ IntPredicate getPropertyPermissions( Set<String> roles, Token token )


try try
{ {
blackListed.add( token.propertyKeyGetOrCreateForName( propName ) ); blackListed.add( tokenLookup.apply( propName ) );
} }
catch ( IllegalTokenNameException e ) catch ( Exception e )
{ {
// This can't happen since propName has already been checked to be valid
securityLog.error( "Error in setting up property permissions, '" + propName + "' is not a valid property name." ); securityLog.error( "Error in setting up property permissions, '" + propName + "' is not a valid property name." );
} }
} }
Expand Down
Expand Up @@ -31,7 +31,6 @@
import java.util.stream.Stream; import java.util.stream.Stream;


import org.neo4j.graphdb.security.AuthorizationViolationException; import org.neo4j.graphdb.security.AuthorizationViolationException;
import org.neo4j.internal.kernel.api.Token;
import org.neo4j.internal.kernel.api.security.AccessMode; import org.neo4j.internal.kernel.api.security.AccessMode;
import org.neo4j.internal.kernel.api.security.AuthSubject; import org.neo4j.internal.kernel.api.security.AuthSubject;
import org.neo4j.internal.kernel.api.security.AuthenticationResult; import org.neo4j.internal.kernel.api.security.AuthenticationResult;
Expand Down Expand Up @@ -67,7 +66,7 @@ public AuthSubject subject()
return neoShiroSubject; return neoShiroSubject;
} }


private StandardAccessMode mode( Token token ) private StandardAccessMode mode( Function<String, Integer> tokenLookup )
{ {
boolean isAuthenticated = shiroSubject.isAuthenticated(); boolean isAuthenticated = shiroSubject.isAuthenticated();
return new StandardAccessMode( return new StandardAccessMode(
Expand All @@ -77,14 +76,14 @@ private StandardAccessMode mode( Token token )
isAuthenticated && shiroSubject.isPermitted( SCHEMA_READ_WRITE ), isAuthenticated && shiroSubject.isPermitted( SCHEMA_READ_WRITE ),
shiroSubject.getAuthenticationResult() == AuthenticationResult.PASSWORD_CHANGE_REQUIRED, shiroSubject.getAuthenticationResult() == AuthenticationResult.PASSWORD_CHANGE_REQUIRED,
queryForRoleNames(), queryForRoleNames(),
queryForPropertyPermissions( token ) queryForPropertyPermissions( tokenLookup )
); );
} }


@Override @Override
public EnterpriseSecurityContext authorize( Token token ) public EnterpriseSecurityContext authorize( Function<String, Integer> tokenLookup )
{ {
StandardAccessMode mode = mode( token ); StandardAccessMode mode = mode( tokenLookup );
return new EnterpriseSecurityContext( neoShiroSubject, mode, mode.roles, isAdmin() ); return new EnterpriseSecurityContext( neoShiroSubject, mode, mode.roles, isAdmin() );
} }


Expand All @@ -107,9 +106,9 @@ private Set<String> queryForRoleNames()
.collect( Collectors.toSet() ); .collect( Collectors.toSet() );
} }


private IntPredicate queryForPropertyPermissions( Token token ) private IntPredicate queryForPropertyPermissions( Function<String, Integer> tokenLookup )
{ {
return authManager.getPropertyPermissions( roles(), token ); return authManager.getPropertyPermissions( roles(), tokenLookup );
} }


private static class StandardAccessMode implements AccessMode private static class StandardAccessMode implements AccessMode
Expand Down
Expand Up @@ -24,10 +24,10 @@
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function;


import org.neo4j.graphdb.QueryExecutionException; import org.neo4j.graphdb.QueryExecutionException;
import org.neo4j.graphdb.Result; import org.neo4j.graphdb.Result;
import org.neo4j.internal.kernel.api.Token;
import org.neo4j.internal.kernel.api.security.AuthSubject; import org.neo4j.internal.kernel.api.security.AuthSubject;
import org.neo4j.internal.kernel.api.security.SecurityContext; import org.neo4j.internal.kernel.api.security.SecurityContext;
import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransaction;
Expand All @@ -41,7 +41,6 @@
import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.neo4j.graphdb.security.AuthorizationViolationException.PERMISSION_DENIED; import static org.neo4j.graphdb.security.AuthorizationViolationException.PERMISSION_DENIED;
import static org.neo4j.values.virtual.VirtualValues.EMPTY_MAP; import static org.neo4j.values.virtual.VirtualValues.EMPTY_MAP;


Expand Down Expand Up @@ -115,7 +114,7 @@ private EnterpriseLoginContext createFakeAnonymousEnterpriseLoginContext()
return new EnterpriseLoginContext() return new EnterpriseLoginContext()
{ {
@Override @Override
public EnterpriseSecurityContext authorize( Token token ) public EnterpriseSecurityContext authorize( Function<String, Integer> tokenLookup )
{ {
return new EnterpriseSecurityContext( subject(), inner.mode(), Collections.emptySet(), false ); return new EnterpriseSecurityContext( subject(), inner.mode(), Collections.emptySet(), false );
} }
Expand All @@ -126,7 +125,7 @@ public Set<String> roles()
return Collections.emptySet(); return Collections.emptySet();
} }


SecurityContext inner = AnonymousContext.none().authorize( mock( Token.class ) ); SecurityContext inner = AnonymousContext.none().authorize( (s) -> -1 );


@Override @Override
public AuthSubject subject() public AuthSubject subject()
Expand Down

0 comments on commit 90d31ed

Please sign in to comment.