Download - Octopus framework; Permission based security framework for Java EE

Transcript
Page 1: Octopus framework; Permission based security framework for Java EE

OctopusJava EE Security Framework

Page 2: Octopus framework; Permission based security framework for Java EE

Concepts

• Authentication– validating the identity of a user

• Authorization– whether a user is allowed to execute a certain

action

• Permission• User/Principal

Page 3: Octopus framework; Permission based security framework for Java EE

Security

• Standards– Only role based

• Not good– Documentation (which role is allowed to do

what)– Change (redeployment because we changed

role assignments to method)

Page 4: Octopus framework; Permission based security framework for Java EE

Permission based

• Each (group) action(s)– Associated with a permission

• User need permission to execute it

• Very complex system– User can be assigned to group– Permissions are assigned to the group

Page 5: Octopus framework; Permission based security framework for Java EE

Octopus

• Permission based• Declarative• Secures

– URL, JSF Components, CDI, EJB

• CDI integrated

Page 6: Octopus framework; Permission based security framework for Java EE

Configuration

• Jar File (maven artifact)– <dependency>

<groupId>be.c4j.ee.security</groupId> <artifactId>octopus</artifactId> <version>0.9.3</version> </dependency>

• octopusConfig.properties• CDI bean implements SecurityDataProvider• WEB-INF/securedURLs.ini• ejb-jar.xml

Page 7: Octopus framework; Permission based security framework for Java EE

octopusConfig.properties

• All configuration options of framework• Required options have default values• Empty file

– Only authentication for URL

Page 8: Octopus framework; Permission based security framework for Java EE

SecurityDataProvider

• Supply authentication and authorization information to Octopus

• AuthenticationInfo getAuthenticationInfo(UsernamePasswordToken token);

• AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals);

Page 9: Octopus framework; Permission based security framework for Java EE

login.xhtml

• No requirements imposed by Octopus• Fields

– #{loginBean.username}– #{loginBean.password}– #{loginBean.doLogin}

• actionListener for the login

• Std JSF messages in case of errors

Page 10: Octopus framework; Permission based security framework for Java EE

getAuthenticationInfo()

• token.getUsername()– User name entered in login screen

• Return null if user name is not known• AuthenticationInfoBuilder

– For easier instantiation of method result

Page 11: Octopus framework; Permission based security framework for Java EE

AuthenticationInfoBuilder

• principalId(Serializable)– Unique identification of user, used in authorization call

• name(String)– Display name for user

• password(Object)– Password for user

• salt(ByteSource)– For salted hashed passwords

• addUserInfo– Additional info usefull for custom permission checks

Page 12: Octopus framework; Permission based security framework for Java EE

getAuthorizationInfo()

• principals.getPrimaryPrincipal().getId()– Id of user supplied during authentication

• AuthorizationInfoBuilder• For easier instantiation of method result

Page 13: Octopus framework; Permission based security framework for Java EE

AuthorizationInfoBuilder

• addPermission()• addPermissions()• Supply permissions for user

Page 14: Octopus framework; Permission based security framework for Java EE

Named permission

• Based on Apache Shiro domain permission• Domain permission

– Domain• Functional area of your application

– Action• Some action within the domain

– Target• Restriction on what items action is allowed

• No interpretation, just strings

Page 15: Octopus framework; Permission based security framework for Java EE

Domain permission

• Example– Department:read:*

• * is wildcard• Used in verifying if user has permission

– User is permitted to execute

Required permission User permission

Department:read:* Department:*:*

Page 16: Octopus framework; Permission based security framework for Java EE

Domain permission(2)

• Multiple values allowed– Department:read,update:*

Page 17: Octopus framework; Permission based security framework for Java EE

Named permission ?

• Assign useful name to permission• Named can be constant of Enum

• Configuration needed in octopusModule

Page 18: Octopus framework; Permission based security framework for Java EE

Define named permission

• enum DemoPermission implements NamedPermission { DEPARTMENT_READ, EMPLOYEE_READ_INFO //…}

• namedPermission.class = be.c4j.demo.security.permission.DemoPermission

Page 19: Octopus framework; Permission based security framework for Java EE

Define named permission (2)

• @ApplicationScoped @Producespublic PermissionLookup<DemoPermission> buildLookup() {

List<NamedDomainPermission> allPermissions = permissionService.getAllPermissions(); return new PermissionLookup<DemoPermission> (allPermissions, DemoPermission.class);}

• Mapping between enum and domain permisions.

Page 20: Octopus framework; Permission based security framework for Java EE

Protect URL

• Specify which URL needs to be protected• Define in securedURLs.ini

• /pages/** = user

• All pages within pages directory (and subdirectories now requires authentication

Page 21: Octopus framework; Permission based security framework for Java EE

Protect URL

• /pages/department/** = user, namedPermission[xxx]

• Pages requires authentication and the named permission xxx– xxx = value of enum class

• np instead of namedPermission also allowed

Page 22: Octopus framework; Permission based security framework for Java EE

Protect JSF component

• <sec:securedComponent permission="DEPARTMENT_CREATE"/>

• Can be placed inside any JSF component• Component only shown when user has

permission

Page 23: Octopus framework; Permission based security framework for Java EE

Protect JSF component (2)

• <sec:requiresUser />• Only authenticated persons see component

• Inverse of rule• not=“true” attribute

– On securedComponent and requiresUser

Page 24: Octopus framework; Permission based security framework for Java EE

Protect EJB method

• Annotation based• @RequiresUser• Custom annotation for named permissions

– @DemoPermissionCheck(DemoPermission.DEPARTMENT_CREATE

Page 25: Octopus framework; Permission based security framework for Java EE

Custom annotation for security

• public @interface DemoPermissionCheck { DemoPermission[] value();}

• namedPermissionCheck.class = be.c4j.demo.security.permission.DemoPermissionCheck

Page 26: Octopus framework; Permission based security framework for Java EE

Custom voters

• extends AbstractGenericVoter• checkPermission(InvocationContext

invocationContext, Set<SecurityViolation> violations) {

• @Named– Needed for securing JSF components

Page 27: Octopus framework; Permission based security framework for Java EE

Custom voters (2)

• Set<SecurityViolation> parameter– Put violations messages, empty means allowed

• this.userPrincipal– Current user info

• this.newSecurityViolation(String)– Create violation, for adding to the Set

Page 28: Octopus framework; Permission based security framework for Java EE

Custom voters and URL

• /pages/updateSalary.xhtml = user, voter[employeeSalaryUpdateVoter]

• this.hasServletRequestInfo(InvocationContext)

– Called from within URL context?• this.getURLRequestParameter(InvocationContext, String)

– Get URL parameter

Page 29: Octopus framework; Permission based security framework for Java EE

Custom voters and EJB methods

• this.checkMethodHasParameterTypes(Set<SecurityViolation>, InvocationContext, Class<?>…)

– Check if method has correct type of parameters– If not, additional entry in Set

• this.verifyMethodHasParameterTypes(InvocationContext, Class<?>…)

– As above, but return boolean– When multiple methods with different

parameter types are supported

Page 30: Octopus framework; Permission based security framework for Java EE

• this.getAssignableParameter(InvocationContext, Class<T>[, int])

– Get parameter value of method call– Optional position can be used if multiple

parameters has same type (0-based)

Page 31: Octopus framework; Permission based security framework for Java EE

Using custom voters on EJB

• @CustomVoterCheck(EmployeeSalaryUpdateVoter.class)

Page 32: Octopus framework; Permission based security framework for Java EE

Custom voters on JSF component

• <sec:securedComponent voter="employeeSalaryUpdateVoter" >

• Voter is the @named CDI bean

Page 33: Octopus framework; Permission based security framework for Java EE

Custom voters on JSF component

• Dynamic parameters• <sec:securedComponent voter="employeeSalaryUpdateVoter" >

<sec:securedComponentParameter value="#{employeeBean.employee.id}" /> </sec:securedComponent></sec:securedComponent>

• #{employeeBean.employee.id}– Becomes the single parameters which can be retrieved

by getAssignableParameter()