Dear Wiki user, You have subscribed to a wiki page or wiki category on "Turbine Wiki" for change notification.
The "Turbine4/Turbine4.0M1/Diff" page has been changed by GeorgKallidis: https://wiki.apache.org/turbine/Turbine4/Turbine4.0M1/Diff?action=diff&rev1=9&rev2=10 Comment: Add HowTo (Draft Mode) for Turbine 4: Data Model Discussion and Extra Column Handling from Dev Mailing List * Turbine now supports several annotations to simplify using Turbine services, loaders and configurations in screens, actions, valves etc. + ---- + == T U R B I N E 4.0 P R E R E L E A S E D R A F T == + ''' D R A F T''' + ---- + === Discussions and Howtos === + + ==== Turbine 4 Entity User Data Model, Facts and Discussion, Fulcrum Security ==== + + Updated content from Turbine developer mailing list discussion (Fri, 08 Jul 2016 11:11:50 GMT). + + '''Introduction''' + + Security/Authentication is now separated and moved into Fulcrum Security. To get a better understanding... + + ... I started with a user model as an example and sketching the situations + with some (pseudo) code. User instantiation is the first place, where a + new user model comes into place - may be a good starting point. + + To get a new user instance in + + 1. Turbine-4-M1 + 1. Turbine-4-M2, Turbine-4-SNAPSHOT + + consider this (pseudocode) examples in + 1. {{{ + org.apache.turbine.services.security.TurbineSecurity.getUserInstance() { + return getService().getUserInstance() + } + }}} where {{{service}}} could be e.g. {{{org.apache.turbine.services.security.BaseSecurityService}}} and the {{{userInstance}}} looks like + {{{ + return (org.apache.turbine.om.security.User) getUserClass().newInstance(); + }}} + + The {{{userClass / userInstance}}} is configured in Turbine configuration e.g. setting + {{{ + services.SecurityService.user.class= org.apache.turbine.om.security.TurbineUser + }}} + which is the default user class. + + The contract interface is {{{ org.apache.turbine.om.security.User}}}. + 1. As configured by default + {{{ + services.SecurityService.user.manager = org.apache.turbine.services.security.DefaultUserManager + }}} + the method {{{getUserInstance}}} has a wrapped user instance: {{{ + TurbineUser u = umDelegate.getUserInstance(); (1) + return wrap(u); (2) + }}} + + (1) umDelegate object implements + {{{org.apache.fulcrum.security.model.turbine.TurbineUserManager}}} (e.g. {{{org.apache.fulcrum.security.torque.turbine.TorqueTurbineUserManagerImpl}}}. Configuration is in Fulcrum ''roleConfiguration.xml''. + {{{<role name="org.apache.fulcrum.security.UserManager" default-class="<umDelegate>">}}}. + The userInstance delegates further e.g. in + {{{org.apache.fulcrum.security.spi.AbstractUserManager.getUserInstance()}}} and may look like this + {{{ + return T user = (T) Class.forName(getClassName()).newInstance(); + }}} + + where the className is configured in Fulcrum XML configuration (''componentConfiguration.xml''.) + + {{{ <userManager><className>}}}, which becomes the {{{userDelegate}}} in {{{DefaultUserImpl}}} + (2) Since Turbine 4.0 {{{wrap}}} code looks like + {{{ + return (U) getUserWrapper(user); + }}} + + It just wraps the user object to keep the contract, by default + {{{org.apache.turbine.om.security.DefaultUserImpl}}} is an implementation of + {{{org.apache.turbine.om.security.User}}} and wraps the {{{userDelegate}}} + {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}} as configured in Fulcrum ''componentConfiguration.xml''. + + The contract interface is {{{<T extends org.apache.turbine.om.security.User>}}}. + + '''Interfaces''' + + This is may be the most interesting part to understand, as the same User interface has been broken up and the semantics changed a little bit. + + 1. - ({{{ org.apache.turbine.om.security.TurbineUser}}} is a class). + + {{{org.apache.turbine.om.security.User}}} (properties: {{{password, email, firstName, lastName, confirmed, createDate, loggedin, accessCounter, perm, temp, updateLastLogin, tempStorage,permStorage}}}) + -> {{{org.apache.turbine.om.security.SecurityEntity}}} (properties: {{{name, id, idAsObject}}}) + -> .. + 2. {{{org.apache.turbine.om.security.User}}} (properties: {{{confirmed, createDate, loggedin, accessCounter, perm, temp, updateLastLogin, tempStorage,permStorage}}}) + -> {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}} (-) + -> {{{org.apache.fulcrum.security.entity.ExtendedUser}}} (properties: {{{email, firstName, lastName, objectData}}}).. + -> {{{org.apache.fulcrum.security.entity.User}}} (property: {{{password}}}) + -> {{{org.apache.fulcrum.security.entity.SecurityEntity}}} (properties: {{{name,id}}}) + -> {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRoleEntity}}} (properties: {{{userGroupRoleSet, add-/removeUserGroupRoleSet}}}) + -> .. + + As a result there is now NO {{{TurbineUser}}} ''class'' any more (except occasionally a ORM generated class), but instead a new ''interface'' (in a different package) with some additional methods (cft. {{{TurbineUserGroupRoleEntity}}}) is present. + This makes sense as the {{{TurbineUser}}} is now a special case in Fulcrum Security. + + '''Default classes''' + 1. {{{org.apache.turbine.om.security.TurbineUser implements org.apache.turbine.om.security.User }}} + 1. {{{org.apache.turbine.om.security.DefaultUserImpl implements org.apache.turbine.om.security.User }}} + + '''More Delegates''' + + 1. - + 1. {{{org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl}}} (properties: {{{email, firstName, lastName, password, objectData}}}) + + Interfaces + -> {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}} + Extended classes + -> org.apache.fulcrum.security.model.turbine.entity.impl.AbstractTurbineSecurityEntityImpl + -> {{{org.apache.fulcrum.security.entity.impl.SecurityEntityImpl}}} (properties: {{{equals, hashCode, toString}}}) + Interfaces + -> {{{org.apache.fulcrum.security.entity.SecurityEntity}}} (properties: {{{id, name}}}) + + '''Caveats''' + + ''Moved properties'' + * {{{Email, FirstName, LastName, Password}}} + + The getter/setter for {{{email, firstName, lastName, password}}} moved from + {{{org.apache.turbine.om.security.User}}} to the new interface {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}}. + + {{{Password}}} is now in an ''interface'' {{{org.apache.fulcrum.security.entity.User}}} of its own, the other setter/getter methods are in + {{{org.apache.fulcrum.security.entity.ExtendedUser}}}. + + * {{{Name}}} and {{{Id}}} + 1. {{{org.apache.turbine.om.security.SecurityEntity}}} + 1. {{{org.apache.fulcrum.security.entity.SecurityEntity}}} + + The {{{id}}} getter/setter methods expect now an ''Object'', while in Turbine M1 version an ''int primitive type'' was expected. The old version had a special accessor {{{idAsObject}}}, which is now removed. + + The new model properties {{{entityId}}} and {{{entityName}}} correspond probably to {{{id}}} and {{{name}}} in some way.. + + '''Old and New''' + + Turbine Interface: {{{org.apache.turbine.om.security.User}}}. + + Old implementation class: {{{org.apache.turbine.om.security.TurbineUser}}}. + + New implementation class: {{{org.apache.turbine.om.security.DefaultUserImpl}}}. + + New extracted Fulcrum interface: {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}}. + + New (example) implementation class: {{{org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl}}}. + + Another implementation class is {{{org.apache.fulcrum.security.torque.turbine.TorqueAbstractTurbineUser}}}, + which provides some extra methods ({{{delete, databaseName, entityId, entityName, update, retrieveAttachedObjects}}}, cft. + {{{org.apache.fulcrum.security.torque.TorqueAbstractSecurityEntity}}}). + + {{{ExtendedUser}}} + {{{org.apache.fulcrum.security.entity.ExtendedUser}}} contains {{{org.apache.fulcrum.security.entity.User}}} ({{{password}}} only getter/setter property). + + '''Torque ''' + + Building Torque ORM with + {{{ + <table name="turbine_user" idMethod="native" baseClass="<baseClass>" interface="org.apache.fulcrum.security.model.turbine.entity.TurbineUser"> + }}} + could be done using as base class, but it´s NOT required. Example options for {{{baseClass}}} e.g.: + * {{{org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl}}} + * {{{org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity}}} + * {{{org.apache.fulcrum.security.torque.turbine.TorqueAbstractTurbineUser}}} + + In this example the generated class in this case is just named TurbineUser by default. + + {{{SecurityService, UserManager}}} + + Both could be found in Turbine and Fulcrum. As said in + [http://turbine.apache.org/turbine/turbine-4.0-M2/services/security-service.html] Fulcrum Managers are just delegates and should/could only be used from Turbine services in Turbine context. + + '''More Examples''' + + {{{org.apache.turbine.services.security.SecurityService}}} ({{{userInstance, getUser..}}}) + + {{{org.apache.turbine.services.security.UserManager}}} ({{{userInstance, authenticate}}} + + {{{org.apache.fulcrum.security.SecurityService}}} ({{{userManager, ..}}}) + + {{{org.apache.fulcrum.security.UserManager}}} ({{{userInstance, authenticate}}} + ---- + + ==== How to handle extra columns in Turbine user table with Fulcrum Security ==== + + '''Introduction''' + + If you have to map colums other than {{{firstName, lastName, email, password}}} to a table you have to implement your own wrapper and set in ''TR.properties''. {{{PermStorage}}} is by default considered in Fulcrum just "as is", i.e. it is saved only in {{{objectData}}}. + + '''Configuration''' + + ''Fulcrum user'': + Turbine userDelegate: Fulcrum {{{<userManager><className>}}} ''componentConfiguration.xml'' + + ''Turbine wrapper'' optional if you have additional columns: + + Turbine wrapper: + {{{ + services.SecurityService.wrapper.class= + + }}} in ''TR.properties''. + + '''Background''' + + Fulcrum security package just saves the {{{permStorage}}} in {{{objectData}}} by default. + + '''(Pseudo) Code example''' + + Turbine {{{ + DefaultUserManager store(User user) + user.setObjectdata(ObjectUtils.serializeMap(user.getPermStorage())); + umDelegate.saveUser(((TurbineUserDelegate)user).getUserDelegate()); + }}} + + calls Fulcrum e.g. {{{TorqueAbstractUserManager}}} + {{{ + saveUser(User user) + }}} + + {{{ + TorqueAbstractSecurityEntity u = (TorqueAbstractSecurityEntity)user; + u.setNew(false); + u.save(); + }}} + + {{{u}}} is the Fulcrum user class, which the user can set (the {{{userDelegate}}}). + + If this user has additional properties they are not set, as {{{permStorage}}} is saved only in {{{objectData}}} by default. + --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
