<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<FONT color="green">003</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<FONT color="green">004</FONT>     * distributed with this work for additional information<a name="line.4"></a>
<FONT color="green">005</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<FONT color="green">006</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<FONT color="green">007</FONT>     * "License"); you may not use this file except in compliance<a name="line.7"></a>
<FONT color="green">008</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<FONT color="green">009</FONT>     *<a name="line.9"></a>
<FONT color="green">010</FONT>     *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.12"></a>
<FONT color="green">013</FONT>     * software distributed under the License is distributed on an<a name="line.13"></a>
<FONT color="green">014</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.14"></a>
<FONT color="green">015</FONT>     * KIND, either express or implied.  See the License for the<a name="line.15"></a>
<FONT color="green">016</FONT>     * specific language governing permissions and limitations<a name="line.16"></a>
<FONT color="green">017</FONT>     * under the License.<a name="line.17"></a>
<FONT color="green">018</FONT>     */<a name="line.18"></a>
<FONT color="green">019</FONT>    package org.apache.shiro.cas;<a name="line.19"></a>
<FONT color="green">020</FONT>    <a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.shiro.authc.AuthenticationException;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.shiro.authc.AuthenticationInfo;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.shiro.authc.AuthenticationToken;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.shiro.authc.SimpleAuthenticationInfo;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.shiro.authz.AuthorizationInfo;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.shiro.authz.SimpleAuthorizationInfo;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.shiro.realm.AuthorizingRealm;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.shiro.subject.PrincipalCollection;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.shiro.subject.SimplePrincipalCollection;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.shiro.util.CollectionUtils;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.shiro.util.StringUtils;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.jasig.cas.client.authentication.AttributePrincipal;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.jasig.cas.client.validation.*;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.slf4j.Logger;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.slf4j.LoggerFactory;<a name="line.35"></a>
<FONT color="green">036</FONT>    <a name="line.36"></a>
<FONT color="green">037</FONT>    import java.util.ArrayList;<a name="line.37"></a>
<FONT color="green">038</FONT>    import java.util.List;<a name="line.38"></a>
<FONT color="green">039</FONT>    import java.util.Map;<a name="line.39"></a>
<FONT color="green">040</FONT>    <a name="line.40"></a>
<FONT color="green">041</FONT>    /**<a name="line.41"></a>
<FONT color="green">042</FONT>     * This realm implementation acts as a CAS client to a CAS server for authentication and basic authorization.<a name="line.42"></a>
<FONT color="green">043</FONT>     * &lt;p/&gt;<a name="line.43"></a>
<FONT color="green">044</FONT>     * This realm functions by inspecting a submitted {@link org.apache.shiro.cas.CasToken CasToken} (which essentially <a name="line.44"></a>
<FONT color="green">045</FONT>     * wraps a CAS service ticket) and validates it against the CAS server using a configured CAS<a name="line.45"></a>
<FONT color="green">046</FONT>     * {@link org.jasig.cas.client.validation.TicketValidator TicketValidator}.<a name="line.46"></a>
<FONT color="green">047</FONT>     * &lt;p/&gt;<a name="line.47"></a>
<FONT color="green">048</FONT>     * The {@link #getValidationProtocol() validationProtocol} is {@code CAS} by default, which indicates that a<a name="line.48"></a>
<FONT color="green">049</FONT>     * a {@link org.jasig.cas.client.validation.Cas20ServiceTicketValidator Cas20ServiceTicketValidator}<a name="line.49"></a>
<FONT color="green">050</FONT>     * will be used for ticket validation.  You can alternatively set<a name="line.50"></a>
<FONT color="green">051</FONT>     * or {@link org.jasig.cas.client.validation.Saml11TicketValidator Saml11TicketValidator} of CAS client. It is based on<a name="line.51"></a>
<FONT color="green">052</FONT>     * {@link AuthorizingRealm AuthorizingRealm} for both authentication and authorization. User id and attributes are retrieved from the CAS<a name="line.52"></a>
<FONT color="green">053</FONT>     * service ticket validation response during authentication phase. Roles and permissions are computed during authorization phase (according<a name="line.53"></a>
<FONT color="green">054</FONT>     * to the attributes previously retrieved).<a name="line.54"></a>
<FONT color="green">055</FONT>     *<a name="line.55"></a>
<FONT color="green">056</FONT>     * @since 1.2<a name="line.56"></a>
<FONT color="green">057</FONT>     */<a name="line.57"></a>
<FONT color="green">058</FONT>    public class CasRealm extends AuthorizingRealm {<a name="line.58"></a>
<FONT color="green">059</FONT>    <a name="line.59"></a>
<FONT color="green">060</FONT>        // default name of the CAS attribute for remember me authentication (CAS 3.4.10+)<a name="line.60"></a>
<FONT color="green">061</FONT>        public static final String DEFAULT_REMEMBER_ME_ATTRIBUTE_NAME = "longTermAuthenticationRequestTokenUsed";<a name="line.61"></a>
<FONT color="green">062</FONT>        public static final String DEFAULT_VALIDATION_PROTOCOL = "CAS";<a name="line.62"></a>
<FONT color="green">063</FONT>        <a name="line.63"></a>
<FONT color="green">064</FONT>        private static Logger log = LoggerFactory.getLogger(CasRealm.class);<a name="line.64"></a>
<FONT color="green">065</FONT>        <a name="line.65"></a>
<FONT color="green">066</FONT>        // this is the url of the CAS server (example : http://host:port/cas)<a name="line.66"></a>
<FONT color="green">067</FONT>        private String casServerUrlPrefix;<a name="line.67"></a>
<FONT color="green">068</FONT>        <a name="line.68"></a>
<FONT color="green">069</FONT>        // this is the CAS service url of the application (example : http://host:port/mycontextpath/shiro-cas)<a name="line.69"></a>
<FONT color="green">070</FONT>        private String casService;<a name="line.70"></a>
<FONT color="green">071</FONT>        <a name="line.71"></a>
<FONT color="green">072</FONT>        /* CAS protocol to use for ticket validation : CAS (default) or SAML :<a name="line.72"></a>
<FONT color="green">073</FONT>           - CAS protocol can be used with CAS server version &lt; 3.1 : in this case, no user attributes can be retrieved from the CAS ticket validation response (except if there are some customizations on CAS server side)<a name="line.73"></a>
<FONT color="green">074</FONT>           - SAML protocol can be used with CAS server version &gt;= 3.1 : in this case, user attributes can be extracted from the CAS ticket validation response<a name="line.74"></a>
<FONT color="green">075</FONT>        */<a name="line.75"></a>
<FONT color="green">076</FONT>        private String validationProtocol = DEFAULT_VALIDATION_PROTOCOL;<a name="line.76"></a>
<FONT color="green">077</FONT>        <a name="line.77"></a>
<FONT color="green">078</FONT>        // default name of the CAS attribute for remember me authentication (CAS 3.4.10+)<a name="line.78"></a>
<FONT color="green">079</FONT>        private String rememberMeAttributeName = DEFAULT_REMEMBER_ME_ATTRIBUTE_NAME;<a name="line.79"></a>
<FONT color="green">080</FONT>        <a name="line.80"></a>
<FONT color="green">081</FONT>        // this class from the CAS client is used to validate a service ticket on CAS server<a name="line.81"></a>
<FONT color="green">082</FONT>        private TicketValidator ticketValidator;<a name="line.82"></a>
<FONT color="green">083</FONT>        <a name="line.83"></a>
<FONT color="green">084</FONT>        // default roles to applied to authenticated user<a name="line.84"></a>
<FONT color="green">085</FONT>        private String defaultRoles;<a name="line.85"></a>
<FONT color="green">086</FONT>        <a name="line.86"></a>
<FONT color="green">087</FONT>        // default permissions to applied to authenticated user<a name="line.87"></a>
<FONT color="green">088</FONT>        private String defaultPermissions;<a name="line.88"></a>
<FONT color="green">089</FONT>        <a name="line.89"></a>
<FONT color="green">090</FONT>        // names of attributes containing roles<a name="line.90"></a>
<FONT color="green">091</FONT>        private String roleAttributeNames;<a name="line.91"></a>
<FONT color="green">092</FONT>        <a name="line.92"></a>
<FONT color="green">093</FONT>        // names of attributes containing permissions<a name="line.93"></a>
<FONT color="green">094</FONT>        private String permissionAttributeNames;<a name="line.94"></a>
<FONT color="green">095</FONT>        <a name="line.95"></a>
<FONT color="green">096</FONT>        public CasRealm() {<a name="line.96"></a>
<FONT color="green">097</FONT>            setAuthenticationTokenClass(CasToken.class);<a name="line.97"></a>
<FONT color="green">098</FONT>        }<a name="line.98"></a>
<FONT color="green">099</FONT>    <a name="line.99"></a>
<FONT color="green">100</FONT>        @Override<a name="line.100"></a>
<FONT color="green">101</FONT>        protected void onInit() {<a name="line.101"></a>
<FONT color="green">102</FONT>            super.onInit();<a name="line.102"></a>
<FONT color="green">103</FONT>            ensureTicketValidator();<a name="line.103"></a>
<FONT color="green">104</FONT>        }<a name="line.104"></a>
<FONT color="green">105</FONT>    <a name="line.105"></a>
<FONT color="green">106</FONT>        protected TicketValidator ensureTicketValidator() {<a name="line.106"></a>
<FONT color="green">107</FONT>            if (this.ticketValidator == null) {<a name="line.107"></a>
<FONT color="green">108</FONT>                this.ticketValidator = createTicketValidator();<a name="line.108"></a>
<FONT color="green">109</FONT>            }<a name="line.109"></a>
<FONT color="green">110</FONT>            return this.ticketValidator;<a name="line.110"></a>
<FONT color="green">111</FONT>        }<a name="line.111"></a>
<FONT color="green">112</FONT>        <a name="line.112"></a>
<FONT color="green">113</FONT>        protected TicketValidator createTicketValidator() {<a name="line.113"></a>
<FONT color="green">114</FONT>            String urlPrefix = getCasServerUrlPrefix();<a name="line.114"></a>
<FONT color="green">115</FONT>            if ("saml".equalsIgnoreCase(getValidationProtocol())) {<a name="line.115"></a>
<FONT color="green">116</FONT>                return new Saml11TicketValidator(urlPrefix);<a name="line.116"></a>
<FONT color="green">117</FONT>            }<a name="line.117"></a>
<FONT color="green">118</FONT>            return new Cas20ServiceTicketValidator(urlPrefix);<a name="line.118"></a>
<FONT color="green">119</FONT>        }<a name="line.119"></a>
<FONT color="green">120</FONT>        <a name="line.120"></a>
<FONT color="green">121</FONT>        /**<a name="line.121"></a>
<FONT color="green">122</FONT>         * Authenticates a user and retrieves its information.<a name="line.122"></a>
<FONT color="green">123</FONT>         * <a name="line.123"></a>
<FONT color="green">124</FONT>         * @param token the authentication token<a name="line.124"></a>
<FONT color="green">125</FONT>         * @throws AuthenticationException if there is an error during authentication.<a name="line.125"></a>
<FONT color="green">126</FONT>         */<a name="line.126"></a>
<FONT color="green">127</FONT>        @Override<a name="line.127"></a>
<FONT color="green">128</FONT>        @SuppressWarnings("unchecked")<a name="line.128"></a>
<FONT color="green">129</FONT>        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {<a name="line.129"></a>
<FONT color="green">130</FONT>            CasToken casToken = (CasToken) token;<a name="line.130"></a>
<FONT color="green">131</FONT>            if (token == null) {<a name="line.131"></a>
<FONT color="green">132</FONT>                return null;<a name="line.132"></a>
<FONT color="green">133</FONT>            }<a name="line.133"></a>
<FONT color="green">134</FONT>            <a name="line.134"></a>
<FONT color="green">135</FONT>            String ticket = (String)casToken.getCredentials();<a name="line.135"></a>
<FONT color="green">136</FONT>            if (!StringUtils.hasText(ticket)) {<a name="line.136"></a>
<FONT color="green">137</FONT>                return null;<a name="line.137"></a>
<FONT color="green">138</FONT>            }<a name="line.138"></a>
<FONT color="green">139</FONT>            <a name="line.139"></a>
<FONT color="green">140</FONT>            TicketValidator ticketValidator = ensureTicketValidator();<a name="line.140"></a>
<FONT color="green">141</FONT>    <a name="line.141"></a>
<FONT color="green">142</FONT>            try {<a name="line.142"></a>
<FONT color="green">143</FONT>                // contact CAS server to validate service ticket<a name="line.143"></a>
<FONT color="green">144</FONT>                Assertion casAssertion = ticketValidator.validate(ticket, getCasService());<a name="line.144"></a>
<FONT color="green">145</FONT>                // get principal, user id and attributes<a name="line.145"></a>
<FONT color="green">146</FONT>                AttributePrincipal casPrincipal = casAssertion.getPrincipal();<a name="line.146"></a>
<FONT color="green">147</FONT>                String userId = casPrincipal.getName();<a name="line.147"></a>
<FONT color="green">148</FONT>                log.debug("Validate ticket : {} in CAS server : {} to retrieve user : {}", new Object[]{<a name="line.148"></a>
<FONT color="green">149</FONT>                        ticket, getCasServerUrlPrefix(), userId<a name="line.149"></a>
<FONT color="green">150</FONT>                });<a name="line.150"></a>
<FONT color="green">151</FONT>    <a name="line.151"></a>
<FONT color="green">152</FONT>                Map&lt;String, Object&gt; attributes = casPrincipal.getAttributes();<a name="line.152"></a>
<FONT color="green">153</FONT>                // refresh authentication token (user id + remember me)<a name="line.153"></a>
<FONT color="green">154</FONT>                casToken.setUserId(userId);<a name="line.154"></a>
<FONT color="green">155</FONT>                String rememberMeAttributeName = getRememberMeAttributeName();<a name="line.155"></a>
<FONT color="green">156</FONT>                String rememberMeStringValue = (String)attributes.get(rememberMeAttributeName);<a name="line.156"></a>
<FONT color="green">157</FONT>                boolean isRemembered = rememberMeStringValue != null &amp;&amp; Boolean.parseBoolean(rememberMeStringValue);<a name="line.157"></a>
<FONT color="green">158</FONT>                if (isRemembered) {<a name="line.158"></a>
<FONT color="green">159</FONT>                    casToken.setRememberMe(true);<a name="line.159"></a>
<FONT color="green">160</FONT>                }<a name="line.160"></a>
<FONT color="green">161</FONT>                // create simple authentication info<a name="line.161"></a>
<FONT color="green">162</FONT>                List&lt;Object&gt; principals = CollectionUtils.asList(userId, attributes);<a name="line.162"></a>
<FONT color="green">163</FONT>                PrincipalCollection principalCollection = new SimplePrincipalCollection(principals, getName());<a name="line.163"></a>
<FONT color="green">164</FONT>                return new SimpleAuthenticationInfo(principalCollection, ticket);<a name="line.164"></a>
<FONT color="green">165</FONT>            } catch (TicketValidationException e) { <a name="line.165"></a>
<FONT color="green">166</FONT>                throw new CasAuthenticationException("Unable to validate ticket [" + ticket + "]", e);<a name="line.166"></a>
<FONT color="green">167</FONT>            }<a name="line.167"></a>
<FONT color="green">168</FONT>        }<a name="line.168"></a>
<FONT color="green">169</FONT>        <a name="line.169"></a>
<FONT color="green">170</FONT>        /**<a name="line.170"></a>
<FONT color="green">171</FONT>         * Retrieves the AuthorizationInfo for the given principals (the CAS previously authenticated user : id + attributes).<a name="line.171"></a>
<FONT color="green">172</FONT>         * <a name="line.172"></a>
<FONT color="green">173</FONT>         * @param principals the primary identifying principals of the AuthorizationInfo that should be retrieved.<a name="line.173"></a>
<FONT color="green">174</FONT>         * @return the AuthorizationInfo associated with this principals.<a name="line.174"></a>
<FONT color="green">175</FONT>         */<a name="line.175"></a>
<FONT color="green">176</FONT>        @Override<a name="line.176"></a>
<FONT color="green">177</FONT>        @SuppressWarnings("unchecked")<a name="line.177"></a>
<FONT color="green">178</FONT>        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {<a name="line.178"></a>
<FONT color="green">179</FONT>            // retrieve user information<a name="line.179"></a>
<FONT color="green">180</FONT>            SimplePrincipalCollection principalCollection = (SimplePrincipalCollection) principals;<a name="line.180"></a>
<FONT color="green">181</FONT>            List&lt;Object&gt; listPrincipals = principalCollection.asList();<a name="line.181"></a>
<FONT color="green">182</FONT>            Map&lt;String, String&gt; attributes = (Map&lt;String, String&gt;) listPrincipals.get(1);<a name="line.182"></a>
<FONT color="green">183</FONT>            // create simple authorization info<a name="line.183"></a>
<FONT color="green">184</FONT>            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();<a name="line.184"></a>
<FONT color="green">185</FONT>            // add default roles<a name="line.185"></a>
<FONT color="green">186</FONT>            addRoles(simpleAuthorizationInfo, split(defaultRoles));<a name="line.186"></a>
<FONT color="green">187</FONT>            // add default permissions<a name="line.187"></a>
<FONT color="green">188</FONT>            addPermissions(simpleAuthorizationInfo, split(defaultPermissions));<a name="line.188"></a>
<FONT color="green">189</FONT>            // get roles from attributes<a name="line.189"></a>
<FONT color="green">190</FONT>            List&lt;String&gt; attributeNames = split(roleAttributeNames);<a name="line.190"></a>
<FONT color="green">191</FONT>            for (String attributeName : attributeNames) {<a name="line.191"></a>
<FONT color="green">192</FONT>                String value = attributes.get(attributeName);<a name="line.192"></a>
<FONT color="green">193</FONT>                addRoles(simpleAuthorizationInfo, split(value));<a name="line.193"></a>
<FONT color="green">194</FONT>            }<a name="line.194"></a>
<FONT color="green">195</FONT>            // get permissions from attributes<a name="line.195"></a>
<FONT color="green">196</FONT>            attributeNames = split(permissionAttributeNames);<a name="line.196"></a>
<FONT color="green">197</FONT>            for (String attributeName : attributeNames) {<a name="line.197"></a>
<FONT color="green">198</FONT>                String value = attributes.get(attributeName);<a name="line.198"></a>
<FONT color="green">199</FONT>                addPermissions(simpleAuthorizationInfo, split(value));<a name="line.199"></a>
<FONT color="green">200</FONT>            }<a name="line.200"></a>
<FONT color="green">201</FONT>            return simpleAuthorizationInfo;<a name="line.201"></a>
<FONT color="green">202</FONT>        }<a name="line.202"></a>
<FONT color="green">203</FONT>        <a name="line.203"></a>
<FONT color="green">204</FONT>        /**<a name="line.204"></a>
<FONT color="green">205</FONT>         * Split a string into a list of not empty and trimmed strings, delimiter is a comma.<a name="line.205"></a>
<FONT color="green">206</FONT>         * <a name="line.206"></a>
<FONT color="green">207</FONT>         * @param s the input string<a name="line.207"></a>
<FONT color="green">208</FONT>         * @return the list of not empty and trimmed strings<a name="line.208"></a>
<FONT color="green">209</FONT>         */<a name="line.209"></a>
<FONT color="green">210</FONT>        private List&lt;String&gt; split(String s) {<a name="line.210"></a>
<FONT color="green">211</FONT>            List&lt;String&gt; list = new ArrayList&lt;String&gt;();<a name="line.211"></a>
<FONT color="green">212</FONT>            String[] elements = StringUtils.split(s, ',');<a name="line.212"></a>
<FONT color="green">213</FONT>            if (elements != null &amp;&amp; elements.length &gt; 0) {<a name="line.213"></a>
<FONT color="green">214</FONT>                for (String element : elements) {<a name="line.214"></a>
<FONT color="green">215</FONT>                    if (StringUtils.hasText(element)) {<a name="line.215"></a>
<FONT color="green">216</FONT>                        list.add(element.trim());<a name="line.216"></a>
<FONT color="green">217</FONT>                    }<a name="line.217"></a>
<FONT color="green">218</FONT>                }<a name="line.218"></a>
<FONT color="green">219</FONT>            }<a name="line.219"></a>
<FONT color="green">220</FONT>            return list;<a name="line.220"></a>
<FONT color="green">221</FONT>        }<a name="line.221"></a>
<FONT color="green">222</FONT>        <a name="line.222"></a>
<FONT color="green">223</FONT>        /**<a name="line.223"></a>
<FONT color="green">224</FONT>         * Add roles to the simple authorization info.<a name="line.224"></a>
<FONT color="green">225</FONT>         * <a name="line.225"></a>
<FONT color="green">226</FONT>         * @param simpleAuthorizationInfo<a name="line.226"></a>
<FONT color="green">227</FONT>         * @param roles the list of roles to add<a name="line.227"></a>
<FONT color="green">228</FONT>         */<a name="line.228"></a>
<FONT color="green">229</FONT>        private void addRoles(SimpleAuthorizationInfo simpleAuthorizationInfo, List&lt;String&gt; roles) {<a name="line.229"></a>
<FONT color="green">230</FONT>            for (String role : roles) {<a name="line.230"></a>
<FONT color="green">231</FONT>                simpleAuthorizationInfo.addRole(role);<a name="line.231"></a>
<FONT color="green">232</FONT>            }<a name="line.232"></a>
<FONT color="green">233</FONT>        }<a name="line.233"></a>
<FONT color="green">234</FONT>        <a name="line.234"></a>
<FONT color="green">235</FONT>        /**<a name="line.235"></a>
<FONT color="green">236</FONT>         * Add permissions to the simple authorization info.<a name="line.236"></a>
<FONT color="green">237</FONT>         * <a name="line.237"></a>
<FONT color="green">238</FONT>         * @param simpleAuthorizationInfo<a name="line.238"></a>
<FONT color="green">239</FONT>         * @param permissions the list of permissions to add<a name="line.239"></a>
<FONT color="green">240</FONT>         */<a name="line.240"></a>
<FONT color="green">241</FONT>        private void addPermissions(SimpleAuthorizationInfo simpleAuthorizationInfo, List&lt;String&gt; permissions) {<a name="line.241"></a>
<FONT color="green">242</FONT>            for (String permission : permissions) {<a name="line.242"></a>
<FONT color="green">243</FONT>                simpleAuthorizationInfo.addStringPermission(permission);<a name="line.243"></a>
<FONT color="green">244</FONT>            }<a name="line.244"></a>
<FONT color="green">245</FONT>        }<a name="line.245"></a>
<FONT color="green">246</FONT>    <a name="line.246"></a>
<FONT color="green">247</FONT>        public String getCasServerUrlPrefix() {<a name="line.247"></a>
<FONT color="green">248</FONT>            return casServerUrlPrefix;<a name="line.248"></a>
<FONT color="green">249</FONT>        }<a name="line.249"></a>
<FONT color="green">250</FONT>    <a name="line.250"></a>
<FONT color="green">251</FONT>        public void setCasServerUrlPrefix(String casServerUrlPrefix) {<a name="line.251"></a>
<FONT color="green">252</FONT>            this.casServerUrlPrefix = casServerUrlPrefix;<a name="line.252"></a>
<FONT color="green">253</FONT>        }<a name="line.253"></a>
<FONT color="green">254</FONT>    <a name="line.254"></a>
<FONT color="green">255</FONT>        public String getCasService() {<a name="line.255"></a>
<FONT color="green">256</FONT>            return casService;<a name="line.256"></a>
<FONT color="green">257</FONT>        }<a name="line.257"></a>
<FONT color="green">258</FONT>    <a name="line.258"></a>
<FONT color="green">259</FONT>        public void setCasService(String casService) {<a name="line.259"></a>
<FONT color="green">260</FONT>            this.casService = casService;<a name="line.260"></a>
<FONT color="green">261</FONT>        }<a name="line.261"></a>
<FONT color="green">262</FONT>    <a name="line.262"></a>
<FONT color="green">263</FONT>        public String getValidationProtocol() {<a name="line.263"></a>
<FONT color="green">264</FONT>            return validationProtocol;<a name="line.264"></a>
<FONT color="green">265</FONT>        }<a name="line.265"></a>
<FONT color="green">266</FONT>    <a name="line.266"></a>
<FONT color="green">267</FONT>        public void setValidationProtocol(String validationProtocol) {<a name="line.267"></a>
<FONT color="green">268</FONT>            this.validationProtocol = validationProtocol;<a name="line.268"></a>
<FONT color="green">269</FONT>        }<a name="line.269"></a>
<FONT color="green">270</FONT>    <a name="line.270"></a>
<FONT color="green">271</FONT>        public String getRememberMeAttributeName() {<a name="line.271"></a>
<FONT color="green">272</FONT>            return rememberMeAttributeName;<a name="line.272"></a>
<FONT color="green">273</FONT>        }<a name="line.273"></a>
<FONT color="green">274</FONT>    <a name="line.274"></a>
<FONT color="green">275</FONT>        public void setRememberMeAttributeName(String rememberMeAttributeName) {<a name="line.275"></a>
<FONT color="green">276</FONT>            this.rememberMeAttributeName = rememberMeAttributeName;<a name="line.276"></a>
<FONT color="green">277</FONT>        }<a name="line.277"></a>
<FONT color="green">278</FONT>    <a name="line.278"></a>
<FONT color="green">279</FONT>        public String getDefaultRoles() {<a name="line.279"></a>
<FONT color="green">280</FONT>            return defaultRoles;<a name="line.280"></a>
<FONT color="green">281</FONT>        }<a name="line.281"></a>
<FONT color="green">282</FONT>    <a name="line.282"></a>
<FONT color="green">283</FONT>        public void setDefaultRoles(String defaultRoles) {<a name="line.283"></a>
<FONT color="green">284</FONT>            this.defaultRoles = defaultRoles;<a name="line.284"></a>
<FONT color="green">285</FONT>        }<a name="line.285"></a>
<FONT color="green">286</FONT>    <a name="line.286"></a>
<FONT color="green">287</FONT>        public String getDefaultPermissions() {<a name="line.287"></a>
<FONT color="green">288</FONT>            return defaultPermissions;<a name="line.288"></a>
<FONT color="green">289</FONT>        }<a name="line.289"></a>
<FONT color="green">290</FONT>    <a name="line.290"></a>
<FONT color="green">291</FONT>        public void setDefaultPermissions(String defaultPermissions) {<a name="line.291"></a>
<FONT color="green">292</FONT>            this.defaultPermissions = defaultPermissions;<a name="line.292"></a>
<FONT color="green">293</FONT>        }<a name="line.293"></a>
<FONT color="green">294</FONT>    <a name="line.294"></a>
<FONT color="green">295</FONT>        public String getRoleAttributeNames() {<a name="line.295"></a>
<FONT color="green">296</FONT>            return roleAttributeNames;<a name="line.296"></a>
<FONT color="green">297</FONT>        }<a name="line.297"></a>
<FONT color="green">298</FONT>    <a name="line.298"></a>
<FONT color="green">299</FONT>        public void setRoleAttributeNames(String roleAttributeNames) {<a name="line.299"></a>
<FONT color="green">300</FONT>            this.roleAttributeNames = roleAttributeNames;<a name="line.300"></a>
<FONT color="green">301</FONT>        }<a name="line.301"></a>
<FONT color="green">302</FONT>    <a name="line.302"></a>
<FONT color="green">303</FONT>        public String getPermissionAttributeNames() {<a name="line.303"></a>
<FONT color="green">304</FONT>            return permissionAttributeNames;<a name="line.304"></a>
<FONT color="green">305</FONT>        }<a name="line.305"></a>
<FONT color="green">306</FONT>    <a name="line.306"></a>
<FONT color="green">307</FONT>        public void setPermissionAttributeNames(String permissionAttributeNames) {<a name="line.307"></a>
<FONT color="green">308</FONT>            this.permissionAttributeNames = permissionAttributeNames;<a name="line.308"></a>
<FONT color="green">309</FONT>        }<a name="line.309"></a>
<FONT color="green">310</FONT>    }<a name="line.310"></a>




























































</PRE>
</BODY>
</HTML>
