11.2. Customer user backend
From open-support.info
m (→Database (Default)) |
m (→LDAP) |
||
(10 intermediate revisions not shown) | |||
Line 1: | Line 1: | ||
{{Book | {{Book | ||
- | |next=/ | + | |next=../3 |
|heading=11.2. | |heading=11.2. | ||
|title=Customer user backend | |title=Customer user backend | ||
|status=effective | |status=effective | ||
- | |progress= | + | |progress=0 |
|author=Dick6809 | |author=Dick6809 | ||
|editor=Dick6809 | |editor=Dick6809 | ||
Line 12: | Line 12: | ||
__TOC__ | __TOC__ | ||
== Database (Default) == | == Database (Default) == | ||
- | + | Example 11-1 shows the configuration of a DB customer backend, which uses customer data stored in the OTRS database. | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
+ | {{book/example | ||
+ | |id= Example 11.1 | ||
+ | |title= Configuring a DB customer backend | ||
+ | |code= | ||
+ | <pre> | ||
# CustomerUser (customer database backend and settings) | # CustomerUser (customer database backend and settings) | ||
$Self->{CustomerUser} = { | $Self->{CustomerUser} = { | ||
Line 88: | Line 88: | ||
}; | }; | ||
</pre> | </pre> | ||
- | + | }} | |
If you want to customize the customer data, change the column's headers or add new ones to the customer_user table in the OTRS database. As an example, Script 11.2 shows how to add a new field for room number. | If you want to customize the customer data, change the column's headers or add new ones to the customer_user table in the OTRS database. As an example, Script 11.2 shows how to add a new field for room number. | ||
- | {| | + | {{book/script |
- | | | + | |id= Script 11.2 |
+ | |title= Adding a room field to the customer_user table. | ||
+ | |code= | ||
<pre> | <pre> | ||
linux:~# mysql -p | linux:~# mysql -p | ||
Line 116: | Line 118: | ||
linux:~# | linux:~# | ||
</pre> | </pre> | ||
- | + | }} | |
- | + | ||
- | + | ||
Now add the new column to the MAP array in Kernel/Config.pm, as shown in Script 11.3. | Now add the new column to the MAP array in Kernel/Config.pm, as shown in Script 11.3. | ||
- | {| | + | {{book/script |
- | | | + | |id= Script 11.3 |
+ | |title= Adding a room field to the Kernel/Config.pm file. | ||
+ | |code= | ||
<pre> | <pre> | ||
# var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | ||
Line 130: | Line 132: | ||
[ 'UserRoom', 'Room', 'room', 0, 1, 'var', '', 0 ], | [ 'UserRoom', 'Room', 'room', 0, 1, 'var', '', 0 ], | ||
</pre> | </pre> | ||
- | + | }} | |
- | + | ||
- | + | ||
It is also possible to edit all this customer information via the Customers link in the Agent interface. | It is also possible to edit all this customer information via the Customers link in the Agent interface. | ||
+ | <br /><br /> | ||
=== Customer with multiple IDs (Company tickets) === | === Customer with multiple IDs (Company tickets) === | ||
Line 142: | Line 143: | ||
To use company tickets, a new column with the IDs that should be accessible for a customer, has to be added to the customer_user table in the OTRS database (see Script 11.4 below). | To use company tickets, a new column with the IDs that should be accessible for a customer, has to be added to the customer_user table in the OTRS database (see Script 11.4 below). | ||
- | { | + | {{book/script |
- | | | + | |code= |
<pre> | <pre> | ||
linux:~# mysql -p | linux:~# mysql -p | ||
Line 165: | Line 166: | ||
linux:~# | linux:~# | ||
</pre> | </pre> | ||
- | | | + | |id= Script 11.4 |
- | + | |title= Adding a customer_ids field to the customer_user table. | |
- | + | }} | |
Now the new column has to be added to the MAP array in Kernel/Config.pm, as shown in Script 11.5. | Now the new column has to be added to the MAP array in Kernel/Config.pm, as shown in Script 11.5. | ||
- | { | + | {{book/script |
- | | | + | |code= |
<pre> | <pre> | ||
# var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | ||
Line 179: | Line 180: | ||
[ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ], | [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ], | ||
</pre> | </pre> | ||
- | | | + | |id= Script 11.5 |
- | + | |title= Adding a UserCustomerIDs field to the Kernel/Config.pm file. | |
- | + | }} | |
Line 189: | Line 190: | ||
- | {| | + | {{book/example |
- | + | |id= Example 11.2 | |
- | | | + | |title= Using company tickets with a DB backend |
- | + | |code= The customers A, B and C exist in your system, and A wants to have access to the tickets of B and C via the customer panel. B and C should have no access to the tickets of other users. | |
- | + | ||
- | The customers A, B and C exist in your system, and A wants to have access to the tickets of B and C via the customer panel. B and C should have no access to the tickets of other users. | + | |
To realize this setup, change the customer_user table and the mapping in Kernel/Config.pm as described above. Then load the settings for customer A via the Customers link in the Agent interface or via the Admin page. If the settings are displayed, add into the field for CustomerIDs the values "B;C;". | To realize this setup, change the customer_user table and the mapping in Kernel/Config.pm as described above. Then load the settings for customer A via the Customers link in the Agent interface or via the Admin page. If the settings are displayed, add into the field for CustomerIDs the values "B;C;". | ||
- | + | }} | |
- | + | ||
<br /> | <br /> | ||
== LDAP == | == LDAP == | ||
+ | If you have a LDAP directory with your customer data, you can use it as the customer backend with OTRS, as shown in Example 11-3. | ||
+ | |||
+ | {{book/example | ||
+ | |id= Example 11.3 | ||
+ | |title= Configuring an LDAP customer backend | ||
+ | |code= | ||
+ | <pre> | ||
+ | # CustomerUser | ||
+ | # (customer ldap backend and settings) | ||
+ | $Self->{CustomerUser} = { | ||
+ | Name => 'LDAP Data Source', | ||
+ | Module => 'Kernel::System::CustomerUser::LDAP', | ||
+ | Params => { | ||
+ | # ldap host | ||
+ | Host => 'bay.csuhayward.edu', | ||
+ | # ldap base dn | ||
+ | BaseDN => 'ou=seas,o=csuh', | ||
+ | # search scope (one|sub) | ||
+ | SSCOPE => 'sub', | ||
+ | # The following is valid but would only be necessary if the | ||
+ | # anonymous user does NOT have permission to read from the LDAP tree | ||
+ | UserDN => '', | ||
+ | UserPw => '', | ||
+ | # in case you want to add always one filter to each ldap query, use | ||
+ | # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)' | ||
+ | AlwaysFilter => '', | ||
+ | # if your frontend is e. g. iso-8859-1 and the charset of your | ||
+ | # ldap server is utf-8, use these options. | ||
+ | # SourceCharset => 'utf-8', | ||
+ | # DestCharset => 'iso-8859-1', | ||
+ | # if both your frontend and your LDAP are unicode, use this: | ||
+ | # SourceCharset => 'utf-8', | ||
+ | # DestCharset => 'utf-8', | ||
+ | # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP) | ||
+ | Params => { | ||
+ | port => 389, | ||
+ | timeout => 120, | ||
+ | async => 0, | ||
+ | version => 3, | ||
+ | }, | ||
+ | }, | ||
+ | # customer unique id | ||
+ | CustomerKey => 'uid', | ||
+ | # customer # | ||
+ | CustomerID => 'mail', | ||
+ | CustomerUserListFields => ['cn', 'mail'], | ||
+ | CustomerUserSearchFields => ['uid', 'cn', 'mail'], | ||
+ | CustomerUserSearchPrefix => '', | ||
+ | CustomerUserSearchSuffix => '*', | ||
+ | CustomerUserSearchListLimit => 250, | ||
+ | CustomerUserPostMasterSearchFields => ['mail'], | ||
+ | CustomerUserNameFields => ['givenname', 'sn'], | ||
+ | # show not own tickets in customer panel, CompanyTickets | ||
+ | CustomerUserExcludePrimaryCustomerID => 0, | ||
+ | # add an ldap filter for valid users (expert setting) | ||
+ | # CustomerUserValidFilter => '(!(description=locked))', | ||
+ | # administrator can't change customer preferences | ||
+ | AdminSetPreferences => 0, | ||
+ | # # cache time to live in sec. - cache any database queries | ||
+ | # CacheTTL => 0, | ||
+ | Map => [ | ||
+ | # note: Login, Email and CustomerID are mandatory! | ||
+ | # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | ||
+ | [ 'UserTitle', 'Title', 'title', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserLogin', 'Username', 'uid', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserEmail', 'Email', 'mail', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var', '', 0 ], | ||
+ | # [ 'UserCustomerIDs', 'CustomerIDs', 'second_customer_ids', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserAddress', 'Address', 'postaladdress', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserComment', 'Comment', 'description', 1, 0, 'var', '', 0 ], | ||
+ | ], | ||
+ | }; | ||
+ | </pre> | ||
+ | }} | ||
+ | |||
+ | |||
+ | If additional customer attributes are stored in your LDAP directory, such as a manager's name, a mobile phone number, or a department, and if you want to display this information in OTRS, just expand the MAP array in Kernel/Config.pm with the entries for these attributes, as shown in Script 11.6. | ||
+ | |||
+ | {{book/script | ||
+ | |code= | ||
+ | <pre> | ||
+ | # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | ||
+ | [...] | ||
+ | [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var', '', 0 ], | ||
+ | </pre> | ||
+ | |id= Script 11.6 | ||
+ | |title= Adding new fields to the Kernel/Config.pm file. | ||
+ | }} | ||
+ | |||
+ | |||
+ | Customer with multiple IDs (Company tickets)It is possible to assign more than one Customer ID to a customer, when using an LDAP backend. To use company tickets, a new field has to be added to the LDAP directory that contains the IDs accessible by the customer. | ||
+ | |||
+ | If the new field in the LDAP directory has been created, the new entry has to be added to the MAP array in Kernel/Config.pm, as shown in Script 11.7. | ||
+ | |||
+ | {{book/script | ||
+ | |code= | ||
+ | <pre> | ||
+ | # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | ||
+ | [...] | ||
+ | [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ], | ||
+ | </pre> | ||
+ | |id= Script 11.7 | ||
+ | |title= Maping new fields to the Kernel/Config.pm file. | ||
+ | }} | ||
+ | |||
+ | |||
+ | The field for the multiple customer IDs has to be edited directly in the LDAP directory. OTRS can only read from LDAP, not write to it. | ||
+ | |||
+ | To ensure access by a customer to the tickets of other customers, add the customer IDs of the customers whose tickets should be accessed to the new field in your LDAP directory. Each ID has to be separated by a semicolon (see Example 11-4 below). | ||
+ | |||
+ | {{book/example | ||
+ | |id= Example 11.4 | ||
+ | |title= Using Company tickets with an LDAP backend | ||
+ | |code= The customers A, B and C exist in your system and A wants to have access to the tickets of B and C via the customer panel. B and C should have no access to tickets of other users. | ||
+ | To realize this setup, change the LDAP directory and the mapping in Kernel/Config.pm as described above. Then add into the field for CustomerIDs the values "B;C;" for customer A in your LDAP directory. | ||
+ | }} | ||
+ | <br /> | ||
+ | |||
+ | == Use more than one customer backend with OTRS == | ||
+ | If you want to utilize more than one customer data source used with OTRS (e.g. an LDAP and a database backend), the CustomerUser config parameter should be expanded with a number, e.g. "CustomerUser1", "CustomerUser2" (see Example 11-5 below). | ||
+ | |||
+ | {{book/example | ||
+ | |id= Example 11.5 | ||
+ | |title= Using more than one customer backend with OTRS | ||
+ | |code= | ||
+ | <pre> | ||
+ | The following configuration example shows usage of both an LDAP and a database customer backend with OTRS. | ||
+ | |||
+ | # 1. Customer user backend: DB | ||
+ | # (customer database backend and settings) | ||
+ | $Self->{CustomerUser1} = { | ||
+ | Name => 'Customer Database', | ||
+ | Module => 'Kernel::System::CustomerUser::DB', | ||
+ | Params => { | ||
+ | # if you want to use an external database, add the | ||
+ | # required settings | ||
+ | # DSN => 'DBI:odbc:yourdsn', | ||
+ | # DSN => 'DBI:mysql:database=customerdb;host=customerdbhost', | ||
+ | # User => '', | ||
+ | # Password => '', | ||
+ | Table => 'customer_user', | ||
+ | }, | ||
+ | # customer unique id | ||
+ | CustomerKey = 'login', | ||
+ | # customer # | ||
+ | CustomerID = 'customer_id', | ||
+ | CustomerValid = 'valid_id', | ||
+ | CustomerUserListFields => ['first_name', 'last_name', 'email'], | ||
+ | CustomerUserSearchFields => ['login', 'last_name', 'customer_id'], | ||
+ | CustomerUserSearchPrefix => '', | ||
+ | CustomerUserSearchSuffix => '*', | ||
+ | CustomerUserSearchListLimit => 250, | ||
+ | CustomerUserPostMasterSearchFields => ['email'], | ||
+ | CustomerUserNameFields => ['salutation','first_name','last_name'], | ||
+ | CustomerUserEmailUniqCheck => 1, | ||
+ | # # show not own tickets in customer panel, CompanyTickets | ||
+ | # CustomerUserExcludePrimaryCustomerID => 0, | ||
+ | # # generate auto logins | ||
+ | # AutoLoginCreation => 0, | ||
+ | # AutoLoginCreationPrefix => 'auto', | ||
+ | # # admin can change customer preferences | ||
+ | # AdminSetPreferences => 1, | ||
+ | # # cache time to live in sec. - cache any database queries | ||
+ | # CacheTTL => 0, | ||
+ | # # just a read only source | ||
+ | # ReadOnly => 1, | ||
+ | Map => [ | ||
+ | |||
+ | # note: Login, Email and CustomerID needed! | ||
+ | # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target | ||
+ | [ 'UserTitle', 'Title', 'title', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserFirstname', 'Firstname', 'first_name', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserLastname', 'Lastname', 'last_name', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserLogin', 'Username', 'login', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserPassword', 'Password', 'pw', 0, 0, 'var', '', 0 ], | ||
+ | [ 'UserEmail', 'Email', 'email', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserCustomerID', 'CustomerID', 'customer_id', 0, 1, 'var', '', 0 ], | ||
+ | [ 'UserPhone', 'Phone', 'phone', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserFax', 'Fax', 'fax', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserMobile', 'Mobile', 'mobile', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserStreet', 'Street', 'street', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserZip', 'Zip', 'zip', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserCity', 'City', 'city', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserCountry', 'Country', 'country', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserComment', 'Comment', 'comments', 1, 0, 'var', '', 0 ], | ||
+ | [ 'ValidID', 'Valid', 'valid_id', 0, 1, 'int', '', 0 ], | ||
+ | ], | ||
+ | # default selections | ||
+ | Selections => { | ||
+ | UserTitle => { | ||
+ | 'Mr.' => 'Mr.', | ||
+ | 'Mrs.' => 'Mrs.', | ||
+ | }, | ||
+ | }, | ||
+ | }; | ||
+ | |||
+ | # 2. Customer user backend: LDAP | ||
+ | # (customer ldap backend and settings) | ||
+ | $Self->{CustomerUser2} = { | ||
+ | Name => 'LDAP Datasource', | ||
+ | Module => 'Kernel::System::CustomerUser::LDAP', | ||
+ | Params => { | ||
+ | # ldap host | ||
+ | Host => 'bay.csuhayward.edu', | ||
+ | # ldap base dn | ||
+ | BaseDN => 'ou=seas,o=csuh', | ||
+ | # search scope (one|sub) | ||
+ | SSCOPE => 'sub', | ||
+ | # # The following is valid but would only be necessary if the | ||
+ | # # anonymous user does NOT have permission to read from the LDAP tree | ||
+ | UserDN => '', | ||
+ | UserPw => '', | ||
+ | # in case you want to add always one filter to each ldap query, use | ||
+ | # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)' | ||
+ | AlwaysFilter => '', | ||
+ | # if both your frontend and your LDAP are unicode, use this: | ||
+ | # SourceCharset => 'utf-8', | ||
+ | # DestCharset => 'utf-8', | ||
+ | # if your frontend is e. g. iso-8859-1 and the character set of your | ||
+ | # ldap server is utf-8, use these options: | ||
+ | # SourceCharset => 'utf-8', | ||
+ | # DestCharset => 'iso-8859-1', | ||
+ | |||
+ | # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP) | ||
+ | Params => { | ||
+ | port => 389, | ||
+ | timeout => 120, | ||
+ | async => 0, | ||
+ | version => 3, | ||
+ | }, | ||
+ | }, | ||
+ | # customer unique id | ||
+ | CustomerKey => 'uid', | ||
+ | # customer # | ||
+ | CustomerID => 'mail', | ||
+ | CustomerUserListFields => ['cn', 'mail'], | ||
+ | CustomerUserSearchFields => ['uid', 'cn', 'mail'], | ||
+ | CustomerUserSearchPrefix => '', | ||
+ | CustomerUserSearchSuffix => '*', | ||
+ | CustomerUserSearchListLimit => 250, | ||
+ | CustomerUserPostMasterSearchFields => ['mail'], | ||
+ | CustomerUserNameFields => ['givenname', 'sn'], | ||
+ | # show not own tickets in customer panel, CompanyTickets | ||
+ | CustomerUserExcludePrimaryCustomerID => 0, | ||
+ | # add a ldap filter for valid users (expert setting) | ||
+ | # CustomerUserValidFilter => '(!(description=locked))', | ||
+ | # admin can't change customer preferences | ||
+ | AdminSetPreferences => 0, | ||
+ | Map => [ | ||
+ | # note: Login, Email and CustomerID needed! | ||
+ | # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly | ||
+ | [ 'UserTitle', 'Title', 'title', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserLogin', 'Username', 'uid', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserEmail', 'Email', 'mail', 1, 1, 'var', '', 0 ], | ||
+ | [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var', '', 0 ], | ||
+ | # [ 'UserCustomerIDs', 'CustomerIDs', 'second_customer_ids', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserAddress', 'Address', 'postaladdress', 1, 0, 'var', '', 0 ], | ||
+ | [ 'UserComment', 'Comment', 'description', 1, 0, 'var', '', 0 ], | ||
+ | ], | ||
+ | }; | ||
+ | </pre> | ||
+ | }} | ||
+ | |||
- | + | It is possible to integrate up to 10 different customer backends. Use the customer management interface in OTRS to view or edit (assuming write access is enabled) all customer data.</onlyinclude> |
Latest revision as of 06:36, 24 April 2011
You can use two types of customer backends, DB and LDAP. If you already have another customer backend (e.g. SAP), it is of course possible to write a module that uses it.
Contents |
Database (Default)
Example 11-1 shows the configuration of a DB customer backend, which uses customer data stored in the OTRS database.
Example 11.1. Configuring a DB customer backend |
# CustomerUser (customer database backend and settings) $Self->{CustomerUser} = { Name => 'Database Datasource', Module => 'Kernel::System::CustomerUser::DB', Params => { # if you want to use an external database, add the required settings # DSN => 'DBI:odbc:yourdsn', # DSN => 'DBI:mysql:database=customerdb;host=customerdbhost', # User => '', # Password => '', Table => 'customer_user', }, # customer unique id CustomerKey => 'login', # customer # CustomerID => 'customer_id', CustomerValid => 'valid_id', CustomerUserListFields => ['first_name', 'last_name', 'email'], CustomerUserSearchFields => ['login', 'last_name', 'customer_id'], CustomerUserSearchPrefix => '', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['email'], CustomerUserNameFields => ['salutation','first_name','last_name'], CustomerUserEmailUniqCheck => 1, # # show not own tickets in customer panel, CompanyTickets # CustomerUserExcludePrimaryCustomerID => 0, # # generate auto logins # AutoLoginCreation => 0, # AutoLoginCreationPrefix => 'auto', # # admin can change customer preferences # AdminSetPreferences => 1, # # cache time to live in sec. - cache any database queries # CacheTTL => 0, # # just a read only source # ReadOnly => 1, Map => [ # note: Login, Email and CustomerID needed! # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target [ 'UserTitle', 'Title', 'title', 1, 0, 'var', '', 0 ], [ 'UserFirstname', 'Firstname', 'first_name', 1, 1, 'var', '', 0 ], [ 'UserLastname', 'Lastname', 'last_name', 1, 1, 'var', '', 0 ], [ 'UserLogin', 'Username', 'login', 1, 1, 'var', '', 0 ], [ 'UserPassword', 'Password', 'pw', 0, 0, 'var', '', 0 ], [ 'UserEmail', 'Email', 'email', 1, 1, 'var', '', 0 ], # [ 'UserEmail', 'Email', 'email', 1, 1, 'var', '$Env{"CGIHandle"}?Action=AgentTicketCompose&ResponseID=1&TicketID=$Data{"TicketID"}&ArticleID=$Data{"ArticleID"}', 0 ], [ 'UserCustomerID', 'CustomerID', 'customer_id', 0, 1, 'var', '', 0 ], # [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ], [ 'UserPhone', 'Phone', 'phone', 1, 0, 'var', '', 0 ], [ 'UserFax', 'Fax', 'fax', 1, 0, 'var', '', 0 ], [ 'UserMobile', 'Mobile', 'mobile', 1, 0, 'var', '', 0 ], [ 'UserStreet', 'Street', 'street', 1, 0, 'var', '', 0 ], [ 'UserZip', 'Zip', 'zip', 1, 0, 'var', '', 0 ], [ 'UserCity', 'City', 'city', 1, 0, 'var', '', 0 ], [ 'UserCountry', 'Country', 'country', 1, 0, 'var', '', 0 ], [ 'UserComment', 'Comment', 'comments', 1, 0, 'var', '', 0 ], [ 'ValidID', 'Valid', 'valid_id', 0, 1, 'int', '', 0 ], ], # default selections Selections => { UserTitle => { 'Mr.' => 'Mr.', 'Mrs.' => 'Mrs.', }, }, }; |
If you want to customize the customer data, change the column's headers or add new ones to the customer_user table in the OTRS database. As an example, Script 11.2 shows how to add a new field for room number.
linux:~# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 116 to server version: 5.0.18-Debian_7-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use otrs; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> ALTER TABLE customer_user ADD room VARCHAR (250); Query OK, 1 rows affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> quit Bye linux:~# |
Script 11.2. Adding a room field to the customer_user table. |
Now add the new column to the MAP array in Kernel/Config.pm, as shown in Script 11.3.
# var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly [...] [ 'UserRoom', 'Room', 'room', 0, 1, 'var', '', 0 ], |
Script 11.3. Adding a room field to the Kernel/Config.pm file. |
It is also possible to edit all this customer information via the Customers link in the Agent interface.
Customer with multiple IDs (Company tickets)
It is possible to assign more than one customer ID to a customer. This can be useful if a customer must access tickets of other customers, e.g. a supervisor wants to watch the tickets of his assistants. If a customer can access the tickets of another customer, the company ticket feature of OTRS is used. Company tickets can be accessed via the "Company Tickets" link in the customer panel.
To use company tickets, a new column with the IDs that should be accessible for a customer, has to be added to the customer_user table in the OTRS database (see Script 11.4 below).
linux:~# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 124 to server version: 5.0.18-Debian_7-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use otrs; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> ALTER TABLE customer_user ADD customer_ids VARCHAR (250); Query OK, 1 rows affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> quit Bye linux:~# |
Script 11.4. Adding a customer_ids field to the customer_user table. |
Now the new column has to be added to the MAP array in Kernel/Config.pm, as shown in Script 11.5.
# var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly [...] [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ], |
Script 11.5. Adding a UserCustomerIDs field to the Kernel/Config.pm file. |
Now, the new column for the multiple customer IDs can be edited via the Agent interface, in the section for the customer management.
To ensure that one customer can access the tickets of other customers, add the IDs of these other users into the new field for the multiple customer IDs. Each ID has to be separated by a semicolon (see Example 11-2 below).
Example 11.2. Using company tickets with a DB backend |
The customers A, B and C exist in your system, and A wants to have access to the tickets of B and C via the customer panel. B and C should have no access to the tickets of other users.
To realize this setup, change the customer_user table and the mapping in Kernel/Config.pm as described above. Then load the settings for customer A via the Customers link in the Agent interface or via the Admin page. If the settings are displayed, add into the field for CustomerIDs the values "B;C;". |
LDAP
If you have a LDAP directory with your customer data, you can use it as the customer backend with OTRS, as shown in Example 11-3.
Example 11.3. Configuring an LDAP customer backend |
# CustomerUser # (customer ldap backend and settings) $Self->{CustomerUser} = { Name => 'LDAP Data Source', Module => 'Kernel::System::CustomerUser::LDAP', Params => { # ldap host Host => 'bay.csuhayward.edu', # ldap base dn BaseDN => 'ou=seas,o=csuh', # search scope (one|sub) SSCOPE => 'sub', # The following is valid but would only be necessary if the # anonymous user does NOT have permission to read from the LDAP tree UserDN => '', UserPw => '', # in case you want to add always one filter to each ldap query, use # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)' AlwaysFilter => '', # if your frontend is e. g. iso-8859-1 and the charset of your # ldap server is utf-8, use these options. # SourceCharset => 'utf-8', # DestCharset => 'iso-8859-1', # if both your frontend and your LDAP are unicode, use this: # SourceCharset => 'utf-8', # DestCharset => 'utf-8', # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP) Params => { port => 389, timeout => 120, async => 0, version => 3, }, }, # customer unique id CustomerKey => 'uid', # customer # CustomerID => 'mail', CustomerUserListFields => ['cn', 'mail'], CustomerUserSearchFields => ['uid', 'cn', 'mail'], CustomerUserSearchPrefix => '', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['mail'], CustomerUserNameFields => ['givenname', 'sn'], # show not own tickets in customer panel, CompanyTickets CustomerUserExcludePrimaryCustomerID => 0, # add an ldap filter for valid users (expert setting) # CustomerUserValidFilter => '(!(description=locked))', # administrator can't change customer preferences AdminSetPreferences => 0, # # cache time to live in sec. - cache any database queries # CacheTTL => 0, Map => [ # note: Login, Email and CustomerID are mandatory! # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly [ 'UserTitle', 'Title', 'title', 1, 0, 'var', '', 0 ], [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var', '', 0 ], [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var', '', 0 ], [ 'UserLogin', 'Username', 'uid', 1, 1, 'var', '', 0 ], [ 'UserEmail', 'Email', 'mail', 1, 1, 'var', '', 0 ], [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var', '', 0 ], # [ 'UserCustomerIDs', 'CustomerIDs', 'second_customer_ids', 1, 0, 'var', '', 0 ], [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var', '', 0 ], [ 'UserAddress', 'Address', 'postaladdress', 1, 0, 'var', '', 0 ], [ 'UserComment', 'Comment', 'description', 1, 0, 'var', '', 0 ], ], }; |
If additional customer attributes are stored in your LDAP directory, such as a manager's name, a mobile phone number, or a department, and if you want to display this information in OTRS, just expand the MAP array in Kernel/Config.pm with the entries for these attributes, as shown in Script 11.6.
# var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly [...] [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var', '', 0 ], |
Script 11.6. Adding new fields to the Kernel/Config.pm file. |
Customer with multiple IDs (Company tickets)It is possible to assign more than one Customer ID to a customer, when using an LDAP backend. To use company tickets, a new field has to be added to the LDAP directory that contains the IDs accessible by the customer.
If the new field in the LDAP directory has been created, the new entry has to be added to the MAP array in Kernel/Config.pm, as shown in Script 11.7.
# var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly [...] [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ], |
Script 11.7. Maping new fields to the Kernel/Config.pm file. |
The field for the multiple customer IDs has to be edited directly in the LDAP directory. OTRS can only read from LDAP, not write to it.
To ensure access by a customer to the tickets of other customers, add the customer IDs of the customers whose tickets should be accessed to the new field in your LDAP directory. Each ID has to be separated by a semicolon (see Example 11-4 below).
Example 11.4. Using Company tickets with an LDAP backend |
The customers A, B and C exist in your system and A wants to have access to the tickets of B and C via the customer panel. B and C should have no access to tickets of other users.
To realize this setup, change the LDAP directory and the mapping in Kernel/Config.pm as described above. Then add into the field for CustomerIDs the values "B;C;" for customer A in your LDAP directory. |
Use more than one customer backend with OTRS
If you want to utilize more than one customer data source used with OTRS (e.g. an LDAP and a database backend), the CustomerUser config parameter should be expanded with a number, e.g. "CustomerUser1", "CustomerUser2" (see Example 11-5 below).
Example 11.5. Using more than one customer backend with OTRS |
The following configuration example shows usage of both an LDAP and a database customer backend with OTRS. # 1. Customer user backend: DB # (customer database backend and settings) $Self->{CustomerUser1} = { Name => 'Customer Database', Module => 'Kernel::System::CustomerUser::DB', Params => { # if you want to use an external database, add the # required settings # DSN => 'DBI:odbc:yourdsn', # DSN => 'DBI:mysql:database=customerdb;host=customerdbhost', # User => '', # Password => '', Table => 'customer_user', }, # customer unique id CustomerKey = 'login', # customer # CustomerID = 'customer_id', CustomerValid = 'valid_id', CustomerUserListFields => ['first_name', 'last_name', 'email'], CustomerUserSearchFields => ['login', 'last_name', 'customer_id'], CustomerUserSearchPrefix => '', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['email'], CustomerUserNameFields => ['salutation','first_name','last_name'], CustomerUserEmailUniqCheck => 1, # # show not own tickets in customer panel, CompanyTickets # CustomerUserExcludePrimaryCustomerID => 0, # # generate auto logins # AutoLoginCreation => 0, # AutoLoginCreationPrefix => 'auto', # # admin can change customer preferences # AdminSetPreferences => 1, # # cache time to live in sec. - cache any database queries # CacheTTL => 0, # # just a read only source # ReadOnly => 1, Map => [ # note: Login, Email and CustomerID needed! # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target [ 'UserTitle', 'Title', 'title', 1, 0, 'var', '', 0 ], [ 'UserFirstname', 'Firstname', 'first_name', 1, 1, 'var', '', 0 ], [ 'UserLastname', 'Lastname', 'last_name', 1, 1, 'var', '', 0 ], [ 'UserLogin', 'Username', 'login', 1, 1, 'var', '', 0 ], [ 'UserPassword', 'Password', 'pw', 0, 0, 'var', '', 0 ], [ 'UserEmail', 'Email', 'email', 1, 1, 'var', '', 0 ], [ 'UserCustomerID', 'CustomerID', 'customer_id', 0, 1, 'var', '', 0 ], [ 'UserPhone', 'Phone', 'phone', 1, 0, 'var', '', 0 ], [ 'UserFax', 'Fax', 'fax', 1, 0, 'var', '', 0 ], [ 'UserMobile', 'Mobile', 'mobile', 1, 0, 'var', '', 0 ], [ 'UserStreet', 'Street', 'street', 1, 0, 'var', '', 0 ], [ 'UserZip', 'Zip', 'zip', 1, 0, 'var', '', 0 ], [ 'UserCity', 'City', 'city', 1, 0, 'var', '', 0 ], [ 'UserCountry', 'Country', 'country', 1, 0, 'var', '', 0 ], [ 'UserComment', 'Comment', 'comments', 1, 0, 'var', '', 0 ], [ 'ValidID', 'Valid', 'valid_id', 0, 1, 'int', '', 0 ], ], # default selections Selections => { UserTitle => { 'Mr.' => 'Mr.', 'Mrs.' => 'Mrs.', }, }, }; # 2. Customer user backend: LDAP # (customer ldap backend and settings) $Self->{CustomerUser2} = { Name => 'LDAP Datasource', Module => 'Kernel::System::CustomerUser::LDAP', Params => { # ldap host Host => 'bay.csuhayward.edu', # ldap base dn BaseDN => 'ou=seas,o=csuh', # search scope (one|sub) SSCOPE => 'sub', # # The following is valid but would only be necessary if the # # anonymous user does NOT have permission to read from the LDAP tree UserDN => '', UserPw => '', # in case you want to add always one filter to each ldap query, use # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)' AlwaysFilter => '', # if both your frontend and your LDAP are unicode, use this: # SourceCharset => 'utf-8', # DestCharset => 'utf-8', # if your frontend is e. g. iso-8859-1 and the character set of your # ldap server is utf-8, use these options: # SourceCharset => 'utf-8', # DestCharset => 'iso-8859-1', # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP) Params => { port => 389, timeout => 120, async => 0, version => 3, }, }, # customer unique id CustomerKey => 'uid', # customer # CustomerID => 'mail', CustomerUserListFields => ['cn', 'mail'], CustomerUserSearchFields => ['uid', 'cn', 'mail'], CustomerUserSearchPrefix => '', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['mail'], CustomerUserNameFields => ['givenname', 'sn'], # show not own tickets in customer panel, CompanyTickets CustomerUserExcludePrimaryCustomerID => 0, # add a ldap filter for valid users (expert setting) # CustomerUserValidFilter => '(!(description=locked))', # admin can't change customer preferences AdminSetPreferences => 0, Map => [ # note: Login, Email and CustomerID needed! # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly [ 'UserTitle', 'Title', 'title', 1, 0, 'var', '', 0 ], [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var', '', 0 ], [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var', '', 0 ], [ 'UserLogin', 'Username', 'uid', 1, 1, 'var', '', 0 ], [ 'UserEmail', 'Email', 'mail', 1, 1, 'var', '', 0 ], [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var', '', 0 ], # [ 'UserCustomerIDs', 'CustomerIDs', 'second_customer_ids', 1, 0, 'var', '', 0 ], [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var', '', 0 ], [ 'UserAddress', 'Address', 'postaladdress', 1, 0, 'var', '', 0 ], [ 'UserComment', 'Comment', 'description', 1, 0, 'var', '', 0 ], ], }; |
It is possible to integrate up to 10 different customer backends. Use the customer management interface in OTRS to view or edit (assuming write access is enabled) all customer data.