<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../../jacoco-resources/report.gif" type="image/gif"/><title>AnnotationAuthorizationFilter.java</title><link rel="stylesheet" href="../../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../../index.html" class="el_report">Apache Shiro :: Test Coverage</a> &gt; <a href="../index.html" class="el_bundle">shiro-jaxrs</a> &gt; <a href="index.source.html" class="el_package">org.apache.shiro.web.jaxrs</a> &gt; <span class="el_source">AnnotationAuthorizationFilter.java</span></div><h1>AnnotationAuthorizationFilter.java</h1><pre class="source lang-java linenums">/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * &quot;License&quot;); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.shiro.web.jaxrs;


import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresGuest;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.apache.shiro.authz.aop.AuthenticatedAnnotationHandler;
import org.apache.shiro.authz.aop.AuthorizingAnnotationHandler;
import org.apache.shiro.authz.aop.GuestAnnotationHandler;
import org.apache.shiro.authz.aop.PermissionAnnotationHandler;
import org.apache.shiro.authz.aop.RoleAnnotationHandler;
import org.apache.shiro.authz.aop.UserAnnotationHandler;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * A filter that grants or denies access to a JAX-RS resource based on the Shiro annotations on it.
 *
 * @see org.apache.shiro.authz.annotation
 * @since 1.4
 */
public class AnnotationAuthorizationFilter implements ContainerRequestFilter {

    private final Map&lt;AuthorizingAnnotationHandler, Annotation&gt; authzChecks;

<span class="fc" id="L54">    public AnnotationAuthorizationFilter(Collection&lt;Annotation&gt; authzSpecs) {</span>
<span class="fc" id="L55">        Map&lt;AuthorizingAnnotationHandler, Annotation&gt; authChecks = new HashMap&lt;AuthorizingAnnotationHandler, Annotation&gt;(authzSpecs.size());</span>
<span class="fc bfc" id="L56" title="All 2 branches covered.">        for (Annotation authSpec : authzSpecs) {</span>
<span class="fc" id="L57">            authChecks.put(createHandler(authSpec), authSpec);</span>
<span class="fc" id="L58">        }</span>
<span class="fc" id="L59">        this.authzChecks = Collections.unmodifiableMap(authChecks);</span>
<span class="fc" id="L60">    }</span>

    private static AuthorizingAnnotationHandler createHandler(Annotation annotation) {
<span class="fc" id="L63">        Class&lt;?&gt; t = annotation.annotationType();</span>
<span class="fc bfc" id="L64" title="All 2 branches covered.">        if (RequiresPermissions.class.equals(t)) return new PermissionAnnotationHandler();</span>
<span class="fc bfc" id="L65" title="All 2 branches covered.">        else if (RequiresRoles.class.equals(t)) return new RoleAnnotationHandler();</span>
<span class="fc bfc" id="L66" title="All 2 branches covered.">        else if (RequiresUser.class.equals(t)) return new UserAnnotationHandler();</span>
<span class="fc bfc" id="L67" title="All 2 branches covered.">        else if (RequiresGuest.class.equals(t)) return new GuestAnnotationHandler();</span>
<span class="pc bpc" id="L68" title="1 of 2 branches missed.">        else if (RequiresAuthentication.class.equals(t)) return new AuthenticatedAnnotationHandler();</span>
<span class="nc" id="L69">        else throw new IllegalArgumentException(&quot;Cannot create a handler for the unknown for annotation &quot; + t);</span>
    }

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

<span class="fc bfc" id="L75" title="All 2 branches covered.">        for (Map.Entry&lt;AuthorizingAnnotationHandler, Annotation&gt; authzCheck : authzChecks.entrySet()) {</span>
<span class="fc" id="L76">            AuthorizingAnnotationHandler handler = authzCheck.getKey();</span>
<span class="fc" id="L77">            Annotation authzSpec = authzCheck.getValue();</span>
<span class="fc" id="L78">            handler.assertAuthorized(authzSpec);</span>
<span class="fc" id="L79">        }</span>
<span class="fc" id="L80">    }</span>

}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.3.201901230119</span></div></body></html>