[ 
https://issues.apache.org/jira/browse/KNOX-2983?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Attila Magyar updated KNOX-2983:
--------------------------------
    Fix Version/s: 2.1.0

> Combine the functionality of different identity assertion providers
> -------------------------------------------------------------------
>
>                 Key: KNOX-2983
>                 URL: https://issues.apache.org/jira/browse/KNOX-2983
>             Project: Apache Knox
>          Issue Type: Improvement
>            Reporter: Attila Magyar
>            Assignee: Attila Magyar
>            Priority: Major
>             Fix For: 2.1.0
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> h2. Motivation
> Currently there is no way to add multiple identity assertion providers and 
> combine the functionality of them. For example one might want to use the 
> Concat identity assertion together with the Switch case provider. This is not 
> possible due to a limitation of Knox which only allows having one identity 
> assertion provider in the topology. Additionally, having a distinct provider 
> for each functionality has its own limitations that prevents expressing 
> complex mappings.
> h2. Expression-Based principal mapping
> The idea behind the Expression-Based principal mapping is that it leverages 
> the language that was introduced by 
> https://issues.apache.org/jira/browse/KNOX-2707.
> {code}
> <provider>
>   <role>identity-assertion</role>
>   <name>HadoopGroupProvider</name>
>   <enabled>true</enabled>
>   <param>
>     <name>expression.principal.mapping</name>
>     <!-- expression that returns the new principal -->
>     <value>...</value>
>   </param>
>   [...]
> </provider>
> {code}
> The value of *expression.principal.mapping* must be a valid expression that 
> evaluates to a string, which will be the new, mapped principal.
> For example, in the following example all authenticated users will be mapped 
> to principal: 'bob'.
> {code}
> <param>
>   <name>expression.principal.mapping</name>
>   <value>'bob'</value>
> </param>
> {code}
> By adding a conditional you can selectively apply the mapping to specific 
> users.
> {code}
> <param>
>   <name>expression.principal.mapping</name>
>   <!-- Only map sam/tom to bob -->
>   <value>
>     (if (or (= username 'sam') 
>             (= username 'tom')) 
>         'bob')
>   </value>
> </param>
> {code}
> When the expression returns *null*, the original principal will be unchanged.
> h2. Reference
> h3. if
> The *if* is an expression (rather than a statement), that has 2 or 3 
> parameters. When you call it with 2 parameters it will behave like an 
> *if-then*, when you call it with 3 parameters it will behave like an 
> *if-then-else* expression. 
> The first parameters is a conditional that must evaluate to either true or 
> false. In case of true, the first branch is evaluated, otherwise the 2nd 
> branch is evaluated. If the 2nd branch is omitted, and the conditional is 
> false, then null is returned.
> Returns 1: {code}(if true 1){code} 
> Returns null: {code}(if false 1){code} 
> Returns 2: {code}(if false 1 2){code} 
> Returns 1: {code}(if true 1 2){code} 
> h4. concat
> The concat function takes variable number of arguments and concats them into 
> one single string.
> {code}
> (concat 'The' 'sun' 'will' 'come' 'up' 'tomorrow.')
> {code}
> This can be used to concat/prepend a prefix or suffix to the usename.
> {code}
> (concat 'prefix_' username '_suffix')
> {code}
> h4. uppercase / lowercase
> Convert a string to upper case and lower case letters.
> {code}
> (uppercase 'sam')
> {code}
> returns 'SAM'
> {code}
> (lowercase 'SAM')
> {code}
> returns 'sam'
> The combination of uppercase/lowercase and concat can be used to capitalize a 
> username
> {code}
> (concat
>     (uppercase (substr username 0 1))
>     (lowercase (substr username 1)))
> {code}
> h4. substr
> The substr function works the same way as Java's subString. It takes one or 
> two parameters, where the first is the begin index, and the second is the end 
> index.
> The substring begins with the character at the specified index and extends to 
> the end of this string.
> {code}
> (substr 'unhappy' 2)
> {code}
> returns 'happy'
> The end index is exclusive. The substring begins at the specified beginIndex 
> and extends to the character at index endIndex - 1.
> {code}
> (substr 'hamburger' 4 8) 
> {code}
> returns 'urge'
> h4. strlen
> The strlen function returns the length of a string.
> {code}
> (strlen 'apple')
> {code}
> returns 5
> For example, a combination of substr and strlen can be used to cut the first 
> and last characters of a username
> {code}
> (substr username 1 (- (strlen username) 1))  
> {code}
>  
> h4. contains
> Check if a string includes a substring.
> {code}
> (contains 'dm' 'admin')
> {code}
> returns true since 'admin' contains 'dm'
> h4. index-of
> Find a substring in the given string and return the (zero based) index.
> {code}
> (index-of 'ppl' 'apple')
> {code}
> returns 1
> {code}
> (index-of 'xx' 'apple')
> {code}
> If the given substring is not found, -1 is returned.
> For example this will find the '@' substring, and return the part coming 
> after the '@' sign.
> {code}
> (if (contains '@' username)
>     (substr username (+ (strlen '@') 
>                         (index-of '@' username))))
> {code}
> ad...@hwx.site will be converted to hwx.site
> Similarly, this will cut everything after the @ sign, including the @ sign.
> {code}
> (if (contains '@' username)
>     (substr username 0 (index-of '@' username)))
> {code}
> ad...@hwx.site will be converted to admin
>  
> h4. starts-with / ends-with
> starts-with and ends-with can be used to check if a string begins or ends 
> with a given substring.
> {code}
> (starts-with 'apple' 'app')
> {code}
> returns true
> {code}
> (ends-with 'apple' 'ple')
> {code}
> returns false
> For example, remove a prefix from a username
> {code}
> (if (starts-with username 'prefix_')
>     (substr username (strlen 'prefix_')))
> {code}
> prefix_admin will be converted to admin
> h4. hash
> The hash function creates a hash table for holding key value pairs. The 
> number or arguments varies, but it must be an even number.
> {code}
> (hash)
> {code}
> returns an empty hash table
> {code}
> (hash 'key1' 'value1' 'key2' 'value2')
> {code}
> returns a hash table with key1=value1, and key2=value2.
> h4. at
> The at function returns the value for the given key from a hash table.
> {code}
> (at username 
>     (hash
>          'tom' 'Thomas'
>          'sam' 'Samual'
>          'admin' 'Administrator'))
> {code}
> This maps the user 'admin' to 'Administrator', 'tom' to 'Thomas' and 'sam' to 
> 'Samuel'
> h4. regex-template
> The regex-template template function works the same was as the [Regex type 
> identity assertion 
> provider|https://knox.apache.org/books/knox-2-0-0/user-guide.html#Regular+Expression+Identity+Assertion+Provider].
> {code}
> (regex-template  username '(.*)@(.*?)\..*' '{1}_{[2]}' (hash 'us' 'USA' 'ca' 
> 'CANADA') true)
> {code}
> The above expression turns 'nob...@us.imaginary.tld' to 'nobody_USA'.
> The regular expression contains optional groups and the template can 
> reference those groups. The last 2 parameters are optional. For more 
> information  
> [see|https://knox.apache.org/books/knox-2-0-0/user-guide.html#Regular+Expression+Identity+Assertion+Provider].



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to