2.3.2 -> 2.4M1
2.4.M1 -> 4.0M1
Major changes
- The following services have been removed:
- Excalibur component service replace by Fulcrum Yaafi
- The following services have been replaced by Fulcrum components:
- cache service
- crypto service
- factory service
- intake service
- localization service
- mime service
- pool service
- upload service (optional)
- xmlrpc service (optional)
- xslt service (optional)
- A new parser service has been introduced
org.apache.turbine.util.pool.Recyclable
is replaced byorg.apache.fulcrum.pool.Recyclable
org.apache.turbine.util.parser.CookieParser
is replaced byorg.apache.fulcrum.parser.CookieParser
org.apache.turbine.util.parser.ParameterParser
is replaced byorg.apache.fulcrum.parser.ParameterParser
org.apache.turbine.util.pool.Recyclable
is replaced byorg.apache.fulcrum.pool.Recyclable
org.apache.turbine.services.pool.TurbinePool
is replaced byorg.apache.fulcrum.pool.PoolService
- Some util classes removed (db,mail,parser,pool,upload)
RunData
now extendsPipelineData
4.0M1 -> 4.0M2
Major changes
- The security service has been replaced with the Fulcrum Security Components, so that
org.apache.turbine.om.security.Group
is replaced byorg.apache.fulcrum.security.entity.Group
org.apache.turbine.om.security.Role
is replaced byorg.apache.fulcrum.security.entity.Role
org.apache.turbine.om.security.Permission
is replaced byorg.apache.fulcrum.security.entity.Permission
org.apache.turbine.util.security.GroupSet
is replaced byorg.apache.fulcrum.security.util.GroupSet
org.apache.turbine.util.security.RoleSet
is replaced byorg.apache.fulcrum.security.util.RoleSet
org.apache.turbine.util.security.PermissionSet
is replaced byorg.apache.fulcrum.security.util.PermissionSet
org.apache.turbine.util.security.AccessControlList
is replaced byorg.apache.fulcrum.security.acl.AccessControlList
org.apache.turbine.util.security.DataBackendException
is replaced byorg.apache.fulcrum.security.util.DataBackendException
org.apache.turbine.util.security.EntityExistsException
is replaced byorg.apache.fulcrum.security.util.EntityExistsException
org.apache.turbine.util.security.PasswordMismatchException
is replaced byorg.apache.fulcrum.security.util.PasswordMismatchException
org.apache.turbine.util.security.UnknownEntityException
is replaced byorg.apache.fulcrum.security.util.UnknownEntityException
org.apache.turbine.util.security.TurbineSecurityException
is replaced byorg.apache.fulcrum.security.util.FulcrumSecurityException
- The default Torque-based scheduler service has been deprecated. The replacement is the Fulcrum Quartz Service.
org.apache.turbine.services.schedule.JobEntry
is now an interface and no longer depends onorg.apache.torque.om.Persistent
- several implementations exist for different schedulers
- the
SchedulerService
contains a factory method for new jobs
- All deprecated
RunData
-related module methods have been removed.- Modules that depend on
RunData
should be derived fromLegacyVelocityAction
,LegacyVelocitySecureAction
,LegacyVelocityScreen
andLegacyVelocitySecureScreen
, respectively
- Modules that depend on
- Turbine now supports several annotations to simplify using Turbine services, loaders and configurations in screens, actions, valves etc.
4.0M2 -> 4.0
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
- Turbine-4-M1
- Turbine-4-M2, Turbine-4
consider this (pseudocode) examples in
- where
org.apache.turbine.services.security.TurbineSecurity.getUserInstance() { return getService().getUserInstance() }
service
could be e.g.org.apache.turbine.services.security.BaseSecurityService
and theuserInstance
looks likeThereturn (org.apache.turbine.om.security.User) getUserClass().newInstance();
userClass / userInstance
is configured in Turbine configuration e.g. settingwhich is the default user class. The contract interface isservices.SecurityService.user.class= org.apache.turbine.om.security.TurbineUser
.org.apache.turbine.om.security.User
- As configured by default
the method
services.SecurityService.user.manager = org.apache.turbine.services.security.DefaultUserManager
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.
- - (
is a class).
org.apache.turbine.om.security.TurbineUser
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
org.apache.turbine.om.security.TurbineUser implements org.apache.turbine.om.security.User
org.apache.turbine.om.security.DefaultUserImpl implements org.apache.turbine.om.security.User
More Delegates
- -
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
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
andId
org.apache.turbine.om.security.SecurityEntity
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.