Skip to content

Commit

Permalink
Merge pull request #48 from jochenberger/add-permission-binding
Browse files Browse the repository at this point in the history
add permission:... binding (fixes #47). Thanks, especially for adding the test!
  • Loading branch information
kaosko authored Sep 2, 2017
2 parents f5562e2 + c4ff9ef commit 568cab9
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 0 deletions.
39 changes: 39 additions & 0 deletions src/main/java/org/tynamo/security/internal/PermissionBinding.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.tynamo.security.internal;

import org.apache.tapestry5.internal.bindings.AbstractBinding;
import org.tynamo.security.services.SecurityService;

public class PermissionBinding extends AbstractBinding {

private final SecurityService securityService;
private final String description;
private final String permission;

public PermissionBinding(final String description, final String permission, final SecurityService securityService) {
this.description = description;
this.permission = permission;
this.securityService = securityService;
}

@Override
public Object get() {
return securityService.hasPermission(permission);
}

@Override
public Class<?> getBindingType() {
return Boolean.class;
}

@Override
public boolean isInvariant() {
return false;
}

@Override
public String toString() {
return String.format("PermissionBinding [description=%s, permission=%s, permissionGranted=%s]", description,
permission, get());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.tynamo.security.internal.services.impl;

import org.apache.tapestry5.Binding;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.ioc.Location;
import org.apache.tapestry5.services.BindingFactory;
import org.tynamo.security.internal.PermissionBinding;
import org.tynamo.security.services.SecurityService;

public class PermissionBindingFactory implements BindingFactory {

private final SecurityService securityService;

public PermissionBindingFactory(final SecurityService securityService) {
this.securityService = securityService;
}

@Override
public Binding newBinding(final String description, final ComponentResources container,
final ComponentResources component, final String expression, final Location location) {
return new PermissionBinding(description, expression, securityService);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import org.apache.tapestry5.plastic.MethodInvocation;
import org.apache.tapestry5.services.ApplicationInitializer;
import org.apache.tapestry5.services.ApplicationInitializerFilter;
import org.apache.tapestry5.services.BindingFactory;
import org.apache.tapestry5.services.BindingSource;
import org.apache.tapestry5.services.ComponentClassResolver;
import org.apache.tapestry5.services.ComponentRequestFilter;
import org.apache.tapestry5.services.Context;
Expand All @@ -50,6 +52,7 @@
import org.tynamo.security.internal.SecurityExceptionHandlerAssistant;
import org.tynamo.security.internal.services.LoginContextService;
import org.tynamo.security.internal.services.impl.LoginContextServiceImpl;
import org.tynamo.security.internal.services.impl.PermissionBindingFactory;
import org.tynamo.security.services.impl.ClassInterceptorsCacheImpl;
import org.tynamo.security.services.impl.SecurityConfiguration;
import org.tynamo.security.services.impl.SecurityFilterChain;
Expand All @@ -61,6 +64,7 @@
import org.tynamo.shiro.extension.authz.aop.DefaultSecurityInterceptor;
import org.tynamo.shiro.extension.authz.aop.SecurityInterceptor;


/**
* The main entry point for Security integration.
*/
Expand Down Expand Up @@ -246,4 +250,9 @@ public static void defaultSecurity(OrderedConfiguration<SecurityFilterChain> con
configuration.add("Modules", factory.createChain("/modules/**").add(factory.anon()).build(), "before:*", "after:ModulesCompressed");
configuration.add("Assets", factory.createChain("/assets/**").add(factory.anon()).build(), "before:*", "after:Modules");
}

@Contribute(BindingSource.class)
public static void addPermissionBinding(final MappedConfiguration<String, BindingFactory> configuration) {
configuration.addInstance("permission", PermissionBindingFactory.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,23 @@ public void testIfGrantedAllRolesComponentFailedAlternateDivisor() throws Except
}
}

@Test(groups = {"loggedIn"}, dependsOnMethods = {"testLogin"})
public void testPermissionBindingSuccess() throws Exception
{
openBase();
assertText("PermissionBindingSuccess", "PermissionBindingSuccess - RENDERED");
}

@Test(groups = {"loggedIn"}, dependsOnMethods = {"testLogin"})
public void testPermissionBindingFailed() throws Exception
{
openBase();
if (isElementPresent("PermissionBindingFailed"))
{
throw new AssertionError("Permission binding failed");
}
}

//----------------------------------------


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,5 +204,14 @@
<t:security.ifGranted t:allPermissions="book:read|book:write">
<div id="IfGrantedAllPermissionsComponentFailed">IfGrantedAllPermissionsComponentFailed - RENDERED</div>
</t:security.ifGranted>

<t:if test="permission:book:read">
<div id="PermissionBindingSuccess">PermissionBindingSuccess - RENDERED</div>
</t:if>

<t:if test="permission:book:write">
<div id="PermissionBindingFailed">PermissionBindingFailed - RENDERED</div>
</t:if>

</body>
</html>

0 comments on commit 568cab9

Please sign in to comment.