<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<main role="main">
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span><a id="line.1">/*</a>
<span class="sourceLineNo">002</span><a id="line.2"> * Licensed to the Apache Software Foundation (ASF) under one</a>
<span class="sourceLineNo">003</span><a id="line.3"> * or more contributor license agreements.  See the NOTICE file</a>
<span class="sourceLineNo">004</span><a id="line.4"> * distributed with this work for additional information</a>
<span class="sourceLineNo">005</span><a id="line.5"> * regarding copyright ownership.  The ASF licenses this file</a>
<span class="sourceLineNo">006</span><a id="line.6"> * to you under the Apache License, Version 2.0 (the</a>
<span class="sourceLineNo">007</span><a id="line.7"> * "License"); you may not use this file except in compliance</a>
<span class="sourceLineNo">008</span><a id="line.8"> * with the License.  You may obtain a copy of the License at</a>
<span class="sourceLineNo">009</span><a id="line.9"> *</a>
<span class="sourceLineNo">010</span><a id="line.10"> *     http://www.apache.org/licenses/LICENSE-2.0</a>
<span class="sourceLineNo">011</span><a id="line.11"> *</a>
<span class="sourceLineNo">012</span><a id="line.12"> * Unless required by applicable law or agreed to in writing,</a>
<span class="sourceLineNo">013</span><a id="line.13"> * software distributed under the License is distributed on an</a>
<span class="sourceLineNo">014</span><a id="line.14"> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</a>
<span class="sourceLineNo">015</span><a id="line.15"> * KIND, either express or implied.  See the License for the</a>
<span class="sourceLineNo">016</span><a id="line.16"> * specific language governing permissions and limitations</a>
<span class="sourceLineNo">017</span><a id="line.17"> * under the License.</a>
<span class="sourceLineNo">018</span><a id="line.18"> */</a>
<span class="sourceLineNo">019</span><a id="line.19">package org.apache.shiro.authz;</a>
<span class="sourceLineNo">020</span><a id="line.20"></a>
<span class="sourceLineNo">021</span><a id="line.21">import org.apache.shiro.authz.permission.PermissionResolver;</a>
<span class="sourceLineNo">022</span><a id="line.22">import org.apache.shiro.authz.permission.PermissionResolverAware;</a>
<span class="sourceLineNo">023</span><a id="line.23">import org.apache.shiro.authz.permission.RolePermissionResolver;</a>
<span class="sourceLineNo">024</span><a id="line.24">import org.apache.shiro.authz.permission.RolePermissionResolverAware;</a>
<span class="sourceLineNo">025</span><a id="line.25">import org.apache.shiro.realm.Realm;</a>
<span class="sourceLineNo">026</span><a id="line.26">import org.apache.shiro.subject.PrincipalCollection;</a>
<span class="sourceLineNo">027</span><a id="line.27"></a>
<span class="sourceLineNo">028</span><a id="line.28">import java.util.Collection;</a>
<span class="sourceLineNo">029</span><a id="line.29">import java.util.List;</a>
<span class="sourceLineNo">030</span><a id="line.30"></a>
<span class="sourceLineNo">031</span><a id="line.31"></a>
<span class="sourceLineNo">032</span><a id="line.32">/**</a>
<span class="sourceLineNo">033</span><a id="line.33"> * A &lt;tt&gt;ModularRealmAuthorizer&lt;/tt&gt; is an &lt;tt&gt;Authorizer&lt;/tt&gt; implementation that consults one or more configured</a>
<span class="sourceLineNo">034</span><a id="line.34"> * {@link Realm Realm}s during an authorization operation.</a>
<span class="sourceLineNo">035</span><a id="line.35"> *</a>
<span class="sourceLineNo">036</span><a id="line.36"> * @since 0.2</a>
<span class="sourceLineNo">037</span><a id="line.37"> */</a>
<span class="sourceLineNo">038</span><a id="line.38">public class ModularRealmAuthorizer implements Authorizer, PermissionResolverAware, RolePermissionResolverAware {</a>
<span class="sourceLineNo">039</span><a id="line.39"></a>
<span class="sourceLineNo">040</span><a id="line.40">    /**</a>
<span class="sourceLineNo">041</span><a id="line.41">     * The realms to consult during any authorization check.</a>
<span class="sourceLineNo">042</span><a id="line.42">     */</a>
<span class="sourceLineNo">043</span><a id="line.43">    protected Collection&lt;Realm&gt; realms;</a>
<span class="sourceLineNo">044</span><a id="line.44"></a>
<span class="sourceLineNo">045</span><a id="line.45">    /**</a>
<span class="sourceLineNo">046</span><a id="line.46">     * A PermissionResolver to be used by &lt;em&gt;all&lt;/em&gt; configured realms.  Leave &lt;code&gt;null&lt;/code&gt; if you wish</a>
<span class="sourceLineNo">047</span><a id="line.47">     * to configure different resolvers for different realms.</a>
<span class="sourceLineNo">048</span><a id="line.48">     */</a>
<span class="sourceLineNo">049</span><a id="line.49">    protected PermissionResolver permissionResolver;</a>
<span class="sourceLineNo">050</span><a id="line.50"></a>
<span class="sourceLineNo">051</span><a id="line.51">    /**</a>
<span class="sourceLineNo">052</span><a id="line.52">     * A RolePermissionResolver to be used by &lt;em&gt;all&lt;/em&gt; configured realms.  Leave &lt;code&gt;null&lt;/code&gt; if you wish</a>
<span class="sourceLineNo">053</span><a id="line.53">     * to configure different resolvers for different realms.</a>
<span class="sourceLineNo">054</span><a id="line.54">     */</a>
<span class="sourceLineNo">055</span><a id="line.55">    protected RolePermissionResolver rolePermissionResolver;</a>
<span class="sourceLineNo">056</span><a id="line.56"></a>
<span class="sourceLineNo">057</span><a id="line.57">    /**</a>
<span class="sourceLineNo">058</span><a id="line.58">     * Default no-argument constructor, does nothing.</a>
<span class="sourceLineNo">059</span><a id="line.59">     */</a>
<span class="sourceLineNo">060</span><a id="line.60">    public ModularRealmAuthorizer() {</a>
<span class="sourceLineNo">061</span><a id="line.61">    }</a>
<span class="sourceLineNo">062</span><a id="line.62"></a>
<span class="sourceLineNo">063</span><a id="line.63">    /**</a>
<span class="sourceLineNo">064</span><a id="line.64">     * Constructor that accepts the &lt;code&gt;Realm&lt;/code&gt;s to consult during an authorization check.  Immediately calls</a>
<span class="sourceLineNo">065</span><a id="line.65">     * {@link #setRealms setRealms(realms)}.</a>
<span class="sourceLineNo">066</span><a id="line.66">     *</a>
<span class="sourceLineNo">067</span><a id="line.67">     * @param realms the realms to consult during an authorization check.</a>
<span class="sourceLineNo">068</span><a id="line.68">     */</a>
<span class="sourceLineNo">069</span><a id="line.69">    public ModularRealmAuthorizer(Collection&lt;Realm&gt; realms) {</a>
<span class="sourceLineNo">070</span><a id="line.70">        setRealms(realms);</a>
<span class="sourceLineNo">071</span><a id="line.71">    }</a>
<span class="sourceLineNo">072</span><a id="line.72"></a>
<span class="sourceLineNo">073</span><a id="line.73">    /**</a>
<span class="sourceLineNo">074</span><a id="line.74">     * Returns the realms wrapped by this &lt;code&gt;Authorizer&lt;/code&gt; which are consulted during an authorization check.</a>
<span class="sourceLineNo">075</span><a id="line.75">     *</a>
<span class="sourceLineNo">076</span><a id="line.76">     * @return the realms wrapped by this &lt;code&gt;Authorizer&lt;/code&gt; which are consulted during an authorization check.</a>
<span class="sourceLineNo">077</span><a id="line.77">     */</a>
<span class="sourceLineNo">078</span><a id="line.78">    public Collection&lt;Realm&gt; getRealms() {</a>
<span class="sourceLineNo">079</span><a id="line.79">        return this.realms;</a>
<span class="sourceLineNo">080</span><a id="line.80">    }</a>
<span class="sourceLineNo">081</span><a id="line.81"></a>
<span class="sourceLineNo">082</span><a id="line.82">    /**</a>
<span class="sourceLineNo">083</span><a id="line.83">     * Sets the realms wrapped by this &lt;code&gt;Authorizer&lt;/code&gt; which are consulted during an authorization check.</a>
<span class="sourceLineNo">084</span><a id="line.84">     *</a>
<span class="sourceLineNo">085</span><a id="line.85">     * @param realms the realms wrapped by this &lt;code&gt;Authorizer&lt;/code&gt; which are consulted during an authorization check.</a>
<span class="sourceLineNo">086</span><a id="line.86">     */</a>
<span class="sourceLineNo">087</span><a id="line.87">    public void setRealms(Collection&lt;Realm&gt; realms) {</a>
<span class="sourceLineNo">088</span><a id="line.88">        this.realms = realms;</a>
<span class="sourceLineNo">089</span><a id="line.89">        applyPermissionResolverToRealms();</a>
<span class="sourceLineNo">090</span><a id="line.90">        applyRolePermissionResolverToRealms();</a>
<span class="sourceLineNo">091</span><a id="line.91">    }</a>
<span class="sourceLineNo">092</span><a id="line.92"></a>
<span class="sourceLineNo">093</span><a id="line.93">    /**</a>
<span class="sourceLineNo">094</span><a id="line.94">     * Returns the PermissionResolver to be used on &lt;em&gt;all&lt;/em&gt; configured realms, or &lt;code&gt;null&lt;/code (the default)</a>
<span class="sourceLineNo">095</span><a id="line.95">     * if all realm instances will each configure their own permission resolver.</a>
<span class="sourceLineNo">096</span><a id="line.96">     *</a>
<span class="sourceLineNo">097</span><a id="line.97">     * @return the PermissionResolver to be used on &lt;em&gt;all&lt;/em&gt; configured realms, or &lt;code&gt;null&lt;/code (the default)</a>
<span class="sourceLineNo">098</span><a id="line.98">     *         if realm instances will each configure their own permission resolver.</a>
<span class="sourceLineNo">099</span><a id="line.99">     * @since 1.0</a>
<span class="sourceLineNo">100</span><a id="line.100">     */</a>
<span class="sourceLineNo">101</span><a id="line.101">    public PermissionResolver getPermissionResolver() {</a>
<span class="sourceLineNo">102</span><a id="line.102">        return this.permissionResolver;</a>
<span class="sourceLineNo">103</span><a id="line.103">    }</a>
<span class="sourceLineNo">104</span><a id="line.104"></a>
<span class="sourceLineNo">105</span><a id="line.105">    /**</a>
<span class="sourceLineNo">106</span><a id="line.106">     * Sets the specified {@link PermissionResolver PermissionResolver} on &lt;em&gt;all&lt;/em&gt; of the wrapped realms that</a>
<span class="sourceLineNo">107</span><a id="line.107">     * implement the {@link org.apache.shiro.authz.permission.PermissionResolverAware PermissionResolverAware} interface.</a>
<span class="sourceLineNo">108</span><a id="line.108">     * &lt;p/&gt;</a>
<span class="sourceLineNo">109</span><a id="line.109">     * Only call this method if you want the permission resolver to be passed to all realms that implement the</a>
<span class="sourceLineNo">110</span><a id="line.110">     * &lt;code&gt;PermissionResolver&lt;/code&gt; interface.  If you do not want this to occur, the realms must</a>
<span class="sourceLineNo">111</span><a id="line.111">     * configure themselves individually (or be configured individually).</a>
<span class="sourceLineNo">112</span><a id="line.112">     *</a>
<span class="sourceLineNo">113</span><a id="line.113">     * @param permissionResolver the permissionResolver to set on all of the wrapped realms that implement the</a>
<span class="sourceLineNo">114</span><a id="line.114">     *                           {@link org.apache.shiro.authz.permission.PermissionResolverAware PermissionResolverAware} interface.</a>
<span class="sourceLineNo">115</span><a id="line.115">     */</a>
<span class="sourceLineNo">116</span><a id="line.116">    public void setPermissionResolver(PermissionResolver permissionResolver) {</a>
<span class="sourceLineNo">117</span><a id="line.117">        this.permissionResolver = permissionResolver;</a>
<span class="sourceLineNo">118</span><a id="line.118">        applyPermissionResolverToRealms();</a>
<span class="sourceLineNo">119</span><a id="line.119">    }</a>
<span class="sourceLineNo">120</span><a id="line.120"></a>
<span class="sourceLineNo">121</span><a id="line.121">    /**</a>
<span class="sourceLineNo">122</span><a id="line.122">     * Sets the internal {@link #getPermissionResolver} on any internal configured</a>
<span class="sourceLineNo">123</span><a id="line.123">     * {@link #getRealms Realms} that implement the {@link org.apache.shiro.authz.permission.PermissionResolverAware PermissionResolverAware} interface.</a>
<span class="sourceLineNo">124</span><a id="line.124">     * &lt;p/&gt;</a>
<span class="sourceLineNo">125</span><a id="line.125">     * This method is called after setting a permissionResolver on this ModularRealmAuthorizer via the</a>
<span class="sourceLineNo">126</span><a id="line.126">     * {@link #setPermissionResolver(org.apache.shiro.authz.permission.PermissionResolver) setPermissionResolver} method.</a>
<span class="sourceLineNo">127</span><a id="line.127">     * &lt;p/&gt;</a>
<span class="sourceLineNo">128</span><a id="line.128">     * It is also called after setting one or more realms via the {@link #setRealms setRealms} method to allow these</a>
<span class="sourceLineNo">129</span><a id="line.129">     * newly available realms to be given the &lt;code&gt;PermissionResolver&lt;/code&gt; already in use.</a>
<span class="sourceLineNo">130</span><a id="line.130">     *</a>
<span class="sourceLineNo">131</span><a id="line.131">     * @since 1.0</a>
<span class="sourceLineNo">132</span><a id="line.132">     */</a>
<span class="sourceLineNo">133</span><a id="line.133">    protected void applyPermissionResolverToRealms() {</a>
<span class="sourceLineNo">134</span><a id="line.134">        PermissionResolver resolver = getPermissionResolver();</a>
<span class="sourceLineNo">135</span><a id="line.135">        Collection&lt;Realm&gt; realms = getRealms();</a>
<span class="sourceLineNo">136</span><a id="line.136">        if (resolver != null &amp;&amp; realms != null &amp;&amp; !realms.isEmpty()) {</a>
<span class="sourceLineNo">137</span><a id="line.137">            for (Realm realm : realms) {</a>
<span class="sourceLineNo">138</span><a id="line.138">                if (realm instanceof PermissionResolverAware) {</a>
<span class="sourceLineNo">139</span><a id="line.139">                    ((PermissionResolverAware) realm).setPermissionResolver(resolver);</a>
<span class="sourceLineNo">140</span><a id="line.140">                }</a>
<span class="sourceLineNo">141</span><a id="line.141">            }</a>
<span class="sourceLineNo">142</span><a id="line.142">        }</a>
<span class="sourceLineNo">143</span><a id="line.143">    }</a>
<span class="sourceLineNo">144</span><a id="line.144"></a>
<span class="sourceLineNo">145</span><a id="line.145">    /**</a>
<span class="sourceLineNo">146</span><a id="line.146">     * Returns the RolePermissionResolver to be used on &lt;em&gt;all&lt;/em&gt; configured realms, or &lt;code&gt;null&lt;/code (the default)</a>
<span class="sourceLineNo">147</span><a id="line.147">     * if all realm instances will each configure their own permission resolver.</a>
<span class="sourceLineNo">148</span><a id="line.148">     *</a>
<span class="sourceLineNo">149</span><a id="line.149">     * @return the RolePermissionResolver to be used on &lt;em&gt;all&lt;/em&gt; configured realms, or &lt;code&gt;null&lt;/code (the default)</a>
<span class="sourceLineNo">150</span><a id="line.150">     *         if realm instances will each configure their own role permission resolver.</a>
<span class="sourceLineNo">151</span><a id="line.151">     * @since 1.0</a>
<span class="sourceLineNo">152</span><a id="line.152">     */</a>
<span class="sourceLineNo">153</span><a id="line.153">    public RolePermissionResolver getRolePermissionResolver() {</a>
<span class="sourceLineNo">154</span><a id="line.154">        return this.rolePermissionResolver;</a>
<span class="sourceLineNo">155</span><a id="line.155">    }</a>
<span class="sourceLineNo">156</span><a id="line.156"></a>
<span class="sourceLineNo">157</span><a id="line.157">    /**</a>
<span class="sourceLineNo">158</span><a id="line.158">     * Sets the specified {@link RolePermissionResolver RolePermissionResolver} on &lt;em&gt;all&lt;/em&gt; of the wrapped realms that</a>
<span class="sourceLineNo">159</span><a id="line.159">     * implement the {@link org.apache.shiro.authz.permission.RolePermissionResolverAware PermissionResolverAware} interface.</a>
<span class="sourceLineNo">160</span><a id="line.160">     * &lt;p/&gt;</a>
<span class="sourceLineNo">161</span><a id="line.161">     * Only call this method if you want the permission resolver to be passed to all realms that implement the</a>
<span class="sourceLineNo">162</span><a id="line.162">     * &lt;code&gt;RolePermissionResolver&lt;/code&gt; interface.  If you do not want this to occur, the realms must</a>
<span class="sourceLineNo">163</span><a id="line.163">     * configure themselves individually (or be configured individually).</a>
<span class="sourceLineNo">164</span><a id="line.164">     *</a>
<span class="sourceLineNo">165</span><a id="line.165">     * @param rolePermissionResolver the rolePermissionResolver to set on all of the wrapped realms that implement the</a>
<span class="sourceLineNo">166</span><a id="line.166">     *                               {@link org.apache.shiro.authz.permission.RolePermissionResolverAware RolePermissionResolverAware} interface.</a>
<span class="sourceLineNo">167</span><a id="line.167">     */</a>
<span class="sourceLineNo">168</span><a id="line.168">    public void setRolePermissionResolver(RolePermissionResolver rolePermissionResolver) {</a>
<span class="sourceLineNo">169</span><a id="line.169">        this.rolePermissionResolver = rolePermissionResolver;</a>
<span class="sourceLineNo">170</span><a id="line.170">        applyRolePermissionResolverToRealms();</a>
<span class="sourceLineNo">171</span><a id="line.171">    }</a>
<span class="sourceLineNo">172</span><a id="line.172"></a>
<span class="sourceLineNo">173</span><a id="line.173"></a>
<span class="sourceLineNo">174</span><a id="line.174">    /**</a>
<span class="sourceLineNo">175</span><a id="line.175">     * Sets the internal {@link #getRolePermissionResolver} on any internal configured</a>
<span class="sourceLineNo">176</span><a id="line.176">     * {@link #getRealms Realms} that implement the {@link org.apache.shiro.authz.permission.RolePermissionResolverAware RolePermissionResolverAware} interface.</a>
<span class="sourceLineNo">177</span><a id="line.177">     * &lt;p/&gt;</a>
<span class="sourceLineNo">178</span><a id="line.178">     * This method is called after setting a rolePermissionResolver on this ModularRealmAuthorizer via the</a>
<span class="sourceLineNo">179</span><a id="line.179">     * {@link #setRolePermissionResolver(org.apache.shiro.authz.permission.RolePermissionResolver) setRolePermissionResolver} method.</a>
<span class="sourceLineNo">180</span><a id="line.180">     * &lt;p/&gt;</a>
<span class="sourceLineNo">181</span><a id="line.181">     * It is also called after setting one or more realms via the {@link #setRealms setRealms} method to allow these</a>
<span class="sourceLineNo">182</span><a id="line.182">     * newly available realms to be given the &lt;code&gt;RolePermissionResolver&lt;/code&gt; already in use.</a>
<span class="sourceLineNo">183</span><a id="line.183">     *</a>
<span class="sourceLineNo">184</span><a id="line.184">     * @since 1.0</a>
<span class="sourceLineNo">185</span><a id="line.185">     */</a>
<span class="sourceLineNo">186</span><a id="line.186">    protected void applyRolePermissionResolverToRealms() {</a>
<span class="sourceLineNo">187</span><a id="line.187">        RolePermissionResolver resolver = getRolePermissionResolver();</a>
<span class="sourceLineNo">188</span><a id="line.188">        Collection&lt;Realm&gt; realms = getRealms();</a>
<span class="sourceLineNo">189</span><a id="line.189">        if (resolver != null &amp;&amp; realms != null &amp;&amp; !realms.isEmpty()) {</a>
<span class="sourceLineNo">190</span><a id="line.190">            for (Realm realm : realms) {</a>
<span class="sourceLineNo">191</span><a id="line.191">                if (realm instanceof RolePermissionResolverAware) {</a>
<span class="sourceLineNo">192</span><a id="line.192">                    ((RolePermissionResolverAware) realm).setRolePermissionResolver(resolver);</a>
<span class="sourceLineNo">193</span><a id="line.193">                }</a>
<span class="sourceLineNo">194</span><a id="line.194">            }</a>
<span class="sourceLineNo">195</span><a id="line.195">        }</a>
<span class="sourceLineNo">196</span><a id="line.196">    }</a>
<span class="sourceLineNo">197</span><a id="line.197"></a>
<span class="sourceLineNo">198</span><a id="line.198"></a>
<span class="sourceLineNo">199</span><a id="line.199">    /**</a>
<span class="sourceLineNo">200</span><a id="line.200">     * Used by the {@link Authorizer Authorizer} implementation methods to ensure that the {@link #setRealms realms}</a>
<span class="sourceLineNo">201</span><a id="line.201">     * has been set.  The default implementation ensures the property is not null and not empty.</a>
<span class="sourceLineNo">202</span><a id="line.202">     *</a>
<span class="sourceLineNo">203</span><a id="line.203">     * @throws IllegalStateException if the &lt;tt&gt;realms&lt;/tt&gt; property is configured incorrectly.</a>
<span class="sourceLineNo">204</span><a id="line.204">     */</a>
<span class="sourceLineNo">205</span><a id="line.205">    protected void assertRealmsConfigured() throws IllegalStateException {</a>
<span class="sourceLineNo">206</span><a id="line.206">        Collection&lt;Realm&gt; realms = getRealms();</a>
<span class="sourceLineNo">207</span><a id="line.207">        if (realms == null || realms.isEmpty()) {</a>
<span class="sourceLineNo">208</span><a id="line.208">            String msg = "Configuration error:  No realms have been configured!  One or more realms must be " +</a>
<span class="sourceLineNo">209</span><a id="line.209">                    "present to execute an authorization operation.";</a>
<span class="sourceLineNo">210</span><a id="line.210">            throw new IllegalStateException(msg);</a>
<span class="sourceLineNo">211</span><a id="line.211">        }</a>
<span class="sourceLineNo">212</span><a id="line.212">    }</a>
<span class="sourceLineNo">213</span><a id="line.213"></a>
<span class="sourceLineNo">214</span><a id="line.214">    /**</a>
<span class="sourceLineNo">215</span><a id="line.215">     * Returns &lt;code&gt;true&lt;/code&gt; if any of the configured realms'</a>
<span class="sourceLineNo">216</span><a id="line.216">     * {@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, String)} returns &lt;code&gt;true&lt;/code&gt;,</a>
<span class="sourceLineNo">217</span><a id="line.217">     * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">218</span><a id="line.218">     */</a>
<span class="sourceLineNo">219</span><a id="line.219">    public boolean isPermitted(PrincipalCollection principals, String permission) {</a>
<span class="sourceLineNo">220</span><a id="line.220">        assertRealmsConfigured();</a>
<span class="sourceLineNo">221</span><a id="line.221">        for (Realm realm : getRealms()) {</a>
<span class="sourceLineNo">222</span><a id="line.222">            if (!(realm instanceof Authorizer)) continue;</a>
<span class="sourceLineNo">223</span><a id="line.223">            if (((Authorizer) realm).isPermitted(principals, permission)) {</a>
<span class="sourceLineNo">224</span><a id="line.224">                return true;</a>
<span class="sourceLineNo">225</span><a id="line.225">            }</a>
<span class="sourceLineNo">226</span><a id="line.226">        }</a>
<span class="sourceLineNo">227</span><a id="line.227">        return false;</a>
<span class="sourceLineNo">228</span><a id="line.228">    }</a>
<span class="sourceLineNo">229</span><a id="line.229"></a>
<span class="sourceLineNo">230</span><a id="line.230">    /**</a>
<span class="sourceLineNo">231</span><a id="line.231">     * Returns &lt;code&gt;true&lt;/code&gt; if any of the configured realms'</a>
<span class="sourceLineNo">232</span><a id="line.232">     * {@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, Permission)} call returns &lt;code&gt;true&lt;/code&gt;,</a>
<span class="sourceLineNo">233</span><a id="line.233">     * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">234</span><a id="line.234">     */</a>
<span class="sourceLineNo">235</span><a id="line.235">    public boolean isPermitted(PrincipalCollection principals, Permission permission) {</a>
<span class="sourceLineNo">236</span><a id="line.236">        assertRealmsConfigured();</a>
<span class="sourceLineNo">237</span><a id="line.237">        for (Realm realm : getRealms()) {</a>
<span class="sourceLineNo">238</span><a id="line.238">            if (!(realm instanceof Authorizer)) continue;</a>
<span class="sourceLineNo">239</span><a id="line.239">            if (((Authorizer) realm).isPermitted(principals, permission)) {</a>
<span class="sourceLineNo">240</span><a id="line.240">                return true;</a>
<span class="sourceLineNo">241</span><a id="line.241">            }</a>
<span class="sourceLineNo">242</span><a id="line.242">        }</a>
<span class="sourceLineNo">243</span><a id="line.243">        return false;</a>
<span class="sourceLineNo">244</span><a id="line.244">    }</a>
<span class="sourceLineNo">245</span><a id="line.245"></a>
<span class="sourceLineNo">246</span><a id="line.246">    /**</a>
<span class="sourceLineNo">247</span><a id="line.247">     * Returns &lt;code&gt;true&lt;/code&gt; if any of the configured realms'</a>
<span class="sourceLineNo">248</span><a id="line.248">     * {@link #isPermittedAll(org.apache.shiro.subject.PrincipalCollection, String...)} call returns</a>
<span class="sourceLineNo">249</span><a id="line.249">     * &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">250</span><a id="line.250">     */</a>
<span class="sourceLineNo">251</span><a id="line.251">    public boolean[] isPermitted(PrincipalCollection principals, String... permissions) {</a>
<span class="sourceLineNo">252</span><a id="line.252">        assertRealmsConfigured();</a>
<span class="sourceLineNo">253</span><a id="line.253">        if (permissions != null &amp;&amp; permissions.length &gt; 0) {</a>
<span class="sourceLineNo">254</span><a id="line.254">            boolean[] isPermitted = new boolean[permissions.length];</a>
<span class="sourceLineNo">255</span><a id="line.255">            for (int i = 0; i &lt; permissions.length; i++) {</a>
<span class="sourceLineNo">256</span><a id="line.256">                isPermitted[i] = isPermitted(principals, permissions[i]);</a>
<span class="sourceLineNo">257</span><a id="line.257">            }</a>
<span class="sourceLineNo">258</span><a id="line.258">            return isPermitted;</a>
<span class="sourceLineNo">259</span><a id="line.259">        }</a>
<span class="sourceLineNo">260</span><a id="line.260">        return new boolean[0];</a>
<span class="sourceLineNo">261</span><a id="line.261">    }</a>
<span class="sourceLineNo">262</span><a id="line.262"></a>
<span class="sourceLineNo">263</span><a id="line.263">    /**</a>
<span class="sourceLineNo">264</span><a id="line.264">     * Returns &lt;code&gt;true&lt;/code&gt; if any of the configured realms'</a>
<span class="sourceLineNo">265</span><a id="line.265">     * {@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, List)} call returns &lt;code&gt;true&lt;/code&gt;,</a>
<span class="sourceLineNo">266</span><a id="line.266">     * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">267</span><a id="line.267">     */</a>
<span class="sourceLineNo">268</span><a id="line.268">    public boolean[] isPermitted(PrincipalCollection principals, List&lt;Permission&gt; permissions) {</a>
<span class="sourceLineNo">269</span><a id="line.269">        assertRealmsConfigured();</a>
<span class="sourceLineNo">270</span><a id="line.270">        if (permissions != null &amp;&amp; !permissions.isEmpty()) {</a>
<span class="sourceLineNo">271</span><a id="line.271">            boolean[] isPermitted = new boolean[permissions.size()];</a>
<span class="sourceLineNo">272</span><a id="line.272">            int i = 0;</a>
<span class="sourceLineNo">273</span><a id="line.273">            for (Permission p : permissions) {</a>
<span class="sourceLineNo">274</span><a id="line.274">                isPermitted[i++] = isPermitted(principals, p);</a>
<span class="sourceLineNo">275</span><a id="line.275">            }</a>
<span class="sourceLineNo">276</span><a id="line.276">            return isPermitted;</a>
<span class="sourceLineNo">277</span><a id="line.277">        }</a>
<span class="sourceLineNo">278</span><a id="line.278"></a>
<span class="sourceLineNo">279</span><a id="line.279">        return new boolean[0];</a>
<span class="sourceLineNo">280</span><a id="line.280">    }</a>
<span class="sourceLineNo">281</span><a id="line.281"></a>
<span class="sourceLineNo">282</span><a id="line.282">    /**</a>
<span class="sourceLineNo">283</span><a id="line.283">     * Returns &lt;code&gt;true&lt;/code&gt; if any of the configured realms'</a>
<span class="sourceLineNo">284</span><a id="line.284">     * {@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, String)} call returns &lt;code&gt;true&lt;/code&gt;</a>
<span class="sourceLineNo">285</span><a id="line.285">     * for &lt;em&gt;all&lt;/em&gt; of the specified string permissions, &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">286</span><a id="line.286">     */</a>
<span class="sourceLineNo">287</span><a id="line.287">    public boolean isPermittedAll(PrincipalCollection principals, String... permissions) {</a>
<span class="sourceLineNo">288</span><a id="line.288">        assertRealmsConfigured();</a>
<span class="sourceLineNo">289</span><a id="line.289">        if (permissions != null &amp;&amp; permissions.length &gt; 0) {</a>
<span class="sourceLineNo">290</span><a id="line.290">            for (String perm : permissions) {</a>
<span class="sourceLineNo">291</span><a id="line.291">                if (!isPermitted(principals, perm)) {</a>
<span class="sourceLineNo">292</span><a id="line.292">                    return false;</a>
<span class="sourceLineNo">293</span><a id="line.293">                }</a>
<span class="sourceLineNo">294</span><a id="line.294">            }</a>
<span class="sourceLineNo">295</span><a id="line.295">        }</a>
<span class="sourceLineNo">296</span><a id="line.296">        return true;</a>
<span class="sourceLineNo">297</span><a id="line.297">    }</a>
<span class="sourceLineNo">298</span><a id="line.298"></a>
<span class="sourceLineNo">299</span><a id="line.299">    /**</a>
<span class="sourceLineNo">300</span><a id="line.300">     * Returns &lt;code&gt;true&lt;/code&gt; if any of the configured realms'</a>
<span class="sourceLineNo">301</span><a id="line.301">     * {@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, Permission)} call returns &lt;code&gt;true&lt;/code&gt;</a>
<span class="sourceLineNo">302</span><a id="line.302">     * for &lt;em&gt;all&lt;/em&gt; of the specified Permissions, &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">303</span><a id="line.303">     */</a>
<span class="sourceLineNo">304</span><a id="line.304">    public boolean isPermittedAll(PrincipalCollection principals, Collection&lt;Permission&gt; permissions) {</a>
<span class="sourceLineNo">305</span><a id="line.305">        assertRealmsConfigured();</a>
<span class="sourceLineNo">306</span><a id="line.306">        if (permissions != null &amp;&amp; !permissions.isEmpty()) {</a>
<span class="sourceLineNo">307</span><a id="line.307">            for (Permission permission : permissions) {</a>
<span class="sourceLineNo">308</span><a id="line.308">                if (!isPermitted(principals, permission)) {</a>
<span class="sourceLineNo">309</span><a id="line.309">                    return false;</a>
<span class="sourceLineNo">310</span><a id="line.310">                }</a>
<span class="sourceLineNo">311</span><a id="line.311">            }</a>
<span class="sourceLineNo">312</span><a id="line.312">        }</a>
<span class="sourceLineNo">313</span><a id="line.313">        return true;</a>
<span class="sourceLineNo">314</span><a id="line.314">    }</a>
<span class="sourceLineNo">315</span><a id="line.315"></a>
<span class="sourceLineNo">316</span><a id="line.316">    /**</a>
<span class="sourceLineNo">317</span><a id="line.317">     * If !{@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, String) isPermitted(permission)}, throws</a>
<span class="sourceLineNo">318</span><a id="line.318">     * an &lt;code&gt;UnauthorizedException&lt;/code&gt; otherwise returns quietly.</a>
<span class="sourceLineNo">319</span><a id="line.319">     */</a>
<span class="sourceLineNo">320</span><a id="line.320">    public void checkPermission(PrincipalCollection principals, String permission) throws AuthorizationException {</a>
<span class="sourceLineNo">321</span><a id="line.321">        assertRealmsConfigured();</a>
<span class="sourceLineNo">322</span><a id="line.322">        if (!isPermitted(principals, permission)) {</a>
<span class="sourceLineNo">323</span><a id="line.323">            throw new UnauthorizedException("Subject does not have permission [" + permission + "]");</a>
<span class="sourceLineNo">324</span><a id="line.324">        }</a>
<span class="sourceLineNo">325</span><a id="line.325">    }</a>
<span class="sourceLineNo">326</span><a id="line.326"></a>
<span class="sourceLineNo">327</span><a id="line.327">    /**</a>
<span class="sourceLineNo">328</span><a id="line.328">     * If !{@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, Permission) isPermitted(permission)}, throws</a>
<span class="sourceLineNo">329</span><a id="line.329">     * an &lt;code&gt;UnauthorizedException&lt;/code&gt; otherwise returns quietly.</a>
<span class="sourceLineNo">330</span><a id="line.330">     */</a>
<span class="sourceLineNo">331</span><a id="line.331">    public void checkPermission(PrincipalCollection principals, Permission permission) throws AuthorizationException {</a>
<span class="sourceLineNo">332</span><a id="line.332">        assertRealmsConfigured();</a>
<span class="sourceLineNo">333</span><a id="line.333">        if (!isPermitted(principals, permission)) {</a>
<span class="sourceLineNo">334</span><a id="line.334">            throw new UnauthorizedException("Subject does not have permission [" + permission + "]");</a>
<span class="sourceLineNo">335</span><a id="line.335">        }</a>
<span class="sourceLineNo">336</span><a id="line.336">    }</a>
<span class="sourceLineNo">337</span><a id="line.337"></a>
<span class="sourceLineNo">338</span><a id="line.338">    /**</a>
<span class="sourceLineNo">339</span><a id="line.339">     * If !{@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, String...) isPermitted(permission)},</a>
<span class="sourceLineNo">340</span><a id="line.340">     * throws an &lt;code&gt;UnauthorizedException&lt;/code&gt; otherwise returns quietly.</a>
<span class="sourceLineNo">341</span><a id="line.341">     */</a>
<span class="sourceLineNo">342</span><a id="line.342">    public void checkPermissions(PrincipalCollection principals, String... permissions) throws AuthorizationException {</a>
<span class="sourceLineNo">343</span><a id="line.343">        assertRealmsConfigured();</a>
<span class="sourceLineNo">344</span><a id="line.344">        if (permissions != null &amp;&amp; permissions.length &gt; 0) {</a>
<span class="sourceLineNo">345</span><a id="line.345">            for (String perm : permissions) {</a>
<span class="sourceLineNo">346</span><a id="line.346">                checkPermission(principals, perm);</a>
<span class="sourceLineNo">347</span><a id="line.347">            }</a>
<span class="sourceLineNo">348</span><a id="line.348">        }</a>
<span class="sourceLineNo">349</span><a id="line.349">    }</a>
<span class="sourceLineNo">350</span><a id="line.350"></a>
<span class="sourceLineNo">351</span><a id="line.351">    /**</a>
<span class="sourceLineNo">352</span><a id="line.352">     * If !{@link #isPermitted(org.apache.shiro.subject.PrincipalCollection, Permission) isPermitted(permission)} for</a>
<span class="sourceLineNo">353</span><a id="line.353">     * &lt;em&gt;all&lt;/em&gt; the given Permissions, throws</a>
<span class="sourceLineNo">354</span><a id="line.354">     * an &lt;code&gt;UnauthorizedException&lt;/code&gt; otherwise returns quietly.</a>
<span class="sourceLineNo">355</span><a id="line.355">     */</a>
<span class="sourceLineNo">356</span><a id="line.356">    public void checkPermissions(PrincipalCollection principals, Collection&lt;Permission&gt; permissions) throws AuthorizationException {</a>
<span class="sourceLineNo">357</span><a id="line.357">        assertRealmsConfigured();</a>
<span class="sourceLineNo">358</span><a id="line.358">        if (permissions != null) {</a>
<span class="sourceLineNo">359</span><a id="line.359">            for (Permission permission : permissions) {</a>
<span class="sourceLineNo">360</span><a id="line.360">                checkPermission(principals, permission);</a>
<span class="sourceLineNo">361</span><a id="line.361">            }</a>
<span class="sourceLineNo">362</span><a id="line.362">        }</a>
<span class="sourceLineNo">363</span><a id="line.363">    }</a>
<span class="sourceLineNo">364</span><a id="line.364"></a>
<span class="sourceLineNo">365</span><a id="line.365">    /**</a>
<span class="sourceLineNo">366</span><a id="line.366">     * Returns &lt;code&gt;true&lt;/code&gt; if any of the configured realms'</a>
<span class="sourceLineNo">367</span><a id="line.367">     * {@link #hasRole(org.apache.shiro.subject.PrincipalCollection, String)} call returns &lt;code&gt;true&lt;/code&gt;,</a>
<span class="sourceLineNo">368</span><a id="line.368">     * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">369</span><a id="line.369">     */</a>
<span class="sourceLineNo">370</span><a id="line.370">    public boolean hasRole(PrincipalCollection principals, String roleIdentifier) {</a>
<span class="sourceLineNo">371</span><a id="line.371">        assertRealmsConfigured();</a>
<span class="sourceLineNo">372</span><a id="line.372">        for (Realm realm : getRealms()) {</a>
<span class="sourceLineNo">373</span><a id="line.373">            if (!(realm instanceof Authorizer)) continue;</a>
<span class="sourceLineNo">374</span><a id="line.374">            if (((Authorizer) realm).hasRole(principals, roleIdentifier)) {</a>
<span class="sourceLineNo">375</span><a id="line.375">                return true;</a>
<span class="sourceLineNo">376</span><a id="line.376">            }</a>
<span class="sourceLineNo">377</span><a id="line.377">        }</a>
<span class="sourceLineNo">378</span><a id="line.378">        return false;</a>
<span class="sourceLineNo">379</span><a id="line.379">    }</a>
<span class="sourceLineNo">380</span><a id="line.380"></a>
<span class="sourceLineNo">381</span><a id="line.381">    /**</a>
<span class="sourceLineNo">382</span><a id="line.382">     * Calls {@link #hasRole(org.apache.shiro.subject.PrincipalCollection, String)} for each role name in the specified</a>
<span class="sourceLineNo">383</span><a id="line.383">     * collection and places the return value from each call at the respective location in the returned array.</a>
<span class="sourceLineNo">384</span><a id="line.384">     */</a>
<span class="sourceLineNo">385</span><a id="line.385">    public boolean[] hasRoles(PrincipalCollection principals, List&lt;String&gt; roleIdentifiers) {</a>
<span class="sourceLineNo">386</span><a id="line.386">        assertRealmsConfigured();</a>
<span class="sourceLineNo">387</span><a id="line.387">        if (roleIdentifiers != null &amp;&amp; !roleIdentifiers.isEmpty()) {</a>
<span class="sourceLineNo">388</span><a id="line.388">            boolean[] hasRoles = new boolean[roleIdentifiers.size()];</a>
<span class="sourceLineNo">389</span><a id="line.389">            int i = 0;</a>
<span class="sourceLineNo">390</span><a id="line.390">            for (String roleId : roleIdentifiers) {</a>
<span class="sourceLineNo">391</span><a id="line.391">                hasRoles[i++] = hasRole(principals, roleId);</a>
<span class="sourceLineNo">392</span><a id="line.392">            }</a>
<span class="sourceLineNo">393</span><a id="line.393">            return hasRoles;</a>
<span class="sourceLineNo">394</span><a id="line.394">        }</a>
<span class="sourceLineNo">395</span><a id="line.395"></a>
<span class="sourceLineNo">396</span><a id="line.396">        return new boolean[0];</a>
<span class="sourceLineNo">397</span><a id="line.397">    }</a>
<span class="sourceLineNo">398</span><a id="line.398"></a>
<span class="sourceLineNo">399</span><a id="line.399">    /**</a>
<span class="sourceLineNo">400</span><a id="line.400">     * Returns &lt;code&gt;true&lt;/code&gt; iff any of the configured realms'</a>
<span class="sourceLineNo">401</span><a id="line.401">     * {@link #hasRole(org.apache.shiro.subject.PrincipalCollection, String)} call returns &lt;code&gt;true&lt;/code&gt; for</a>
<span class="sourceLineNo">402</span><a id="line.402">     * &lt;em&gt;all&lt;/em&gt; roles specified, &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">403</span><a id="line.403">     */</a>
<span class="sourceLineNo">404</span><a id="line.404">    public boolean hasAllRoles(PrincipalCollection principals, Collection&lt;String&gt; roleIdentifiers) {</a>
<span class="sourceLineNo">405</span><a id="line.405">        assertRealmsConfigured();</a>
<span class="sourceLineNo">406</span><a id="line.406">        for (String roleIdentifier : roleIdentifiers) {</a>
<span class="sourceLineNo">407</span><a id="line.407">            if (!hasRole(principals, roleIdentifier)) {</a>
<span class="sourceLineNo">408</span><a id="line.408">                return false;</a>
<span class="sourceLineNo">409</span><a id="line.409">            }</a>
<span class="sourceLineNo">410</span><a id="line.410">        }</a>
<span class="sourceLineNo">411</span><a id="line.411">        return true;</a>
<span class="sourceLineNo">412</span><a id="line.412">    }</a>
<span class="sourceLineNo">413</span><a id="line.413"></a>
<span class="sourceLineNo">414</span><a id="line.414">    /**</a>
<span class="sourceLineNo">415</span><a id="line.415">     * If !{@link #hasRole(org.apache.shiro.subject.PrincipalCollection, String) hasRole(role)}, throws</a>
<span class="sourceLineNo">416</span><a id="line.416">     * an &lt;code&gt;UnauthorizedException&lt;/code&gt; otherwise returns quietly.</a>
<span class="sourceLineNo">417</span><a id="line.417">     */</a>
<span class="sourceLineNo">418</span><a id="line.418">    public void checkRole(PrincipalCollection principals, String role) throws AuthorizationException {</a>
<span class="sourceLineNo">419</span><a id="line.419">        assertRealmsConfigured();</a>
<span class="sourceLineNo">420</span><a id="line.420">        if (!hasRole(principals, role)) {</a>
<span class="sourceLineNo">421</span><a id="line.421">            throw new UnauthorizedException("Subject does not have role [" + role + "]");</a>
<span class="sourceLineNo">422</span><a id="line.422">        }</a>
<span class="sourceLineNo">423</span><a id="line.423">    }</a>
<span class="sourceLineNo">424</span><a id="line.424"></a>
<span class="sourceLineNo">425</span><a id="line.425">    /**</a>
<span class="sourceLineNo">426</span><a id="line.426">     * Calls {@link #checkRoles(PrincipalCollection principals, String... roles) checkRoles(PrincipalCollection principals, String... roles) }.</a>
<span class="sourceLineNo">427</span><a id="line.427">     */</a>
<span class="sourceLineNo">428</span><a id="line.428">    public void checkRoles(PrincipalCollection principals, Collection&lt;String&gt; roles) throws AuthorizationException {</a>
<span class="sourceLineNo">429</span><a id="line.429">        //SHIRO-234 - roles.toArray() -&gt; roles.toArray(new String[roles.size()])</a>
<span class="sourceLineNo">430</span><a id="line.430">        if (roles != null &amp;&amp; !roles.isEmpty()) checkRoles(principals, roles.toArray(new String[roles.size()]));</a>
<span class="sourceLineNo">431</span><a id="line.431">    }</a>
<span class="sourceLineNo">432</span><a id="line.432"></a>
<span class="sourceLineNo">433</span><a id="line.433">    /**</a>
<span class="sourceLineNo">434</span><a id="line.434">     * Calls {@link #checkRole(org.apache.shiro.subject.PrincipalCollection, String) checkRole} for each role specified.</a>
<span class="sourceLineNo">435</span><a id="line.435">     */</a>
<span class="sourceLineNo">436</span><a id="line.436">    public void checkRoles(PrincipalCollection principals, String... roles) throws AuthorizationException {</a>
<span class="sourceLineNo">437</span><a id="line.437">        assertRealmsConfigured();</a>
<span class="sourceLineNo">438</span><a id="line.438">        if (roles != null) {</a>
<span class="sourceLineNo">439</span><a id="line.439">            for (String role : roles) {</a>
<span class="sourceLineNo">440</span><a id="line.440">                checkRole(principals, role);</a>
<span class="sourceLineNo">441</span><a id="line.441">            }</a>
<span class="sourceLineNo">442</span><a id="line.442">        }</a>
<span class="sourceLineNo">443</span><a id="line.443">    }</a>
<span class="sourceLineNo">444</span><a id="line.444">}</a>




























































</pre>
</div>
</main>
</body>
</html>
