<!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.web.jaxrs;</a>
<span class="sourceLineNo">020</span><a id="line.20"></a>
<span class="sourceLineNo">021</span><a id="line.21">import org.apache.shiro.SecurityUtils;</a>
<span class="sourceLineNo">022</span><a id="line.22">import org.apache.shiro.subject.PrincipalCollection;</a>
<span class="sourceLineNo">023</span><a id="line.23">import org.apache.shiro.subject.Subject;</a>
<span class="sourceLineNo">024</span><a id="line.24"></a>
<span class="sourceLineNo">025</span><a id="line.25">import javax.ws.rs.container.ContainerRequestContext;</a>
<span class="sourceLineNo">026</span><a id="line.26">import javax.ws.rs.core.SecurityContext;</a>
<span class="sourceLineNo">027</span><a id="line.27">import java.security.Principal;</a>
<span class="sourceLineNo">028</span><a id="line.28"></a>
<span class="sourceLineNo">029</span><a id="line.29">/**</a>
<span class="sourceLineNo">030</span><a id="line.30"> * A Shiro based {@link SecurityContext} that exposes the current Shiro {@link Subject} as a {@link Principal}.</a>
<span class="sourceLineNo">031</span><a id="line.31"> * The {@link #isUserInRole(String)} method returns the result of {@link Subject#hasRole(String)}.</a>
<span class="sourceLineNo">032</span><a id="line.32"> *</a>
<span class="sourceLineNo">033</span><a id="line.33"> * @since 1.4</a>
<span class="sourceLineNo">034</span><a id="line.34"> */</a>
<span class="sourceLineNo">035</span><a id="line.35">public class ShiroSecurityContext implements SecurityContext {</a>
<span class="sourceLineNo">036</span><a id="line.36"></a>
<span class="sourceLineNo">037</span><a id="line.37">    final private ContainerRequestContext containerRequestContext;</a>
<span class="sourceLineNo">038</span><a id="line.38">    final private SecurityContext originalSecurityContext;</a>
<span class="sourceLineNo">039</span><a id="line.39"></a>
<span class="sourceLineNo">040</span><a id="line.40">    public ShiroSecurityContext(ContainerRequestContext containerRequestContext) {</a>
<span class="sourceLineNo">041</span><a id="line.41">        this.containerRequestContext = containerRequestContext;</a>
<span class="sourceLineNo">042</span><a id="line.42">        this.originalSecurityContext = containerRequestContext.getSecurityContext();</a>
<span class="sourceLineNo">043</span><a id="line.43">    }</a>
<span class="sourceLineNo">044</span><a id="line.44"></a>
<span class="sourceLineNo">045</span><a id="line.45">    @Override</a>
<span class="sourceLineNo">046</span><a id="line.46">    public Principal getUserPrincipal() {</a>
<span class="sourceLineNo">047</span><a id="line.47"></a>
<span class="sourceLineNo">048</span><a id="line.48">        Principal result;</a>
<span class="sourceLineNo">049</span><a id="line.49"></a>
<span class="sourceLineNo">050</span><a id="line.50">        Subject subject = getSubject();</a>
<span class="sourceLineNo">051</span><a id="line.51">        PrincipalCollection shiroPrincipals = subject.getPrincipals();</a>
<span class="sourceLineNo">052</span><a id="line.52">        if (shiroPrincipals != null) {</a>
<span class="sourceLineNo">053</span><a id="line.53">            result = shiroPrincipals.oneByType(Principal.class);</a>
<span class="sourceLineNo">054</span><a id="line.54"></a>
<span class="sourceLineNo">055</span><a id="line.55">            if (result == null) {</a>
<span class="sourceLineNo">056</span><a id="line.56">                result = new ObjectPrincipal(shiroPrincipals.getPrimaryPrincipal());</a>
<span class="sourceLineNo">057</span><a id="line.57">            }</a>
<span class="sourceLineNo">058</span><a id="line.58">        }</a>
<span class="sourceLineNo">059</span><a id="line.59">        else {</a>
<span class="sourceLineNo">060</span><a id="line.60">            result = originalSecurityContext.getUserPrincipal();</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">        return result;</a>
<span class="sourceLineNo">064</span><a id="line.64">    }</a>
<span class="sourceLineNo">065</span><a id="line.65"></a>
<span class="sourceLineNo">066</span><a id="line.66">    @Override</a>
<span class="sourceLineNo">067</span><a id="line.67">    public boolean isUserInRole(String role) {</a>
<span class="sourceLineNo">068</span><a id="line.68">        return getSubject().hasRole(role);</a>
<span class="sourceLineNo">069</span><a id="line.69">    }</a>
<span class="sourceLineNo">070</span><a id="line.70"></a>
<span class="sourceLineNo">071</span><a id="line.71">    @Override</a>
<span class="sourceLineNo">072</span><a id="line.72">    public boolean isSecure() {</a>
<span class="sourceLineNo">073</span><a id="line.73">        return containerRequestContext.getSecurityContext().isSecure();</a>
<span class="sourceLineNo">074</span><a id="line.74">    }</a>
<span class="sourceLineNo">075</span><a id="line.75"></a>
<span class="sourceLineNo">076</span><a id="line.76">    @Override</a>
<span class="sourceLineNo">077</span><a id="line.77">    public String getAuthenticationScheme() {</a>
<span class="sourceLineNo">078</span><a id="line.78">        return containerRequestContext.getSecurityContext().getAuthenticationScheme();</a>
<span class="sourceLineNo">079</span><a id="line.79">    }</a>
<span class="sourceLineNo">080</span><a id="line.80"></a>
<span class="sourceLineNo">081</span><a id="line.81">    private Subject getSubject() {</a>
<span class="sourceLineNo">082</span><a id="line.82">        return SecurityUtils.getSubject();</a>
<span class="sourceLineNo">083</span><a id="line.83">    }</a>
<span class="sourceLineNo">084</span><a id="line.84"></a>
<span class="sourceLineNo">085</span><a id="line.85"></a>
<span class="sourceLineNo">086</span><a id="line.86">    /**</a>
<span class="sourceLineNo">087</span><a id="line.87">     * Java Principal wrapper around any Shiro Principal object.s</a>
<span class="sourceLineNo">088</span><a id="line.88">     */</a>
<span class="sourceLineNo">089</span><a id="line.89">    private class ObjectPrincipal implements Principal {</a>
<span class="sourceLineNo">090</span><a id="line.90">        private Object object = null;</a>
<span class="sourceLineNo">091</span><a id="line.91"></a>
<span class="sourceLineNo">092</span><a id="line.92">        public ObjectPrincipal(Object object) {</a>
<span class="sourceLineNo">093</span><a id="line.93">            this.object = object;</a>
<span class="sourceLineNo">094</span><a id="line.94">        }</a>
<span class="sourceLineNo">095</span><a id="line.95"></a>
<span class="sourceLineNo">096</span><a id="line.96">        public Object getObject() {</a>
<span class="sourceLineNo">097</span><a id="line.97">            return object;</a>
<span class="sourceLineNo">098</span><a id="line.98">        }</a>
<span class="sourceLineNo">099</span><a id="line.99"></a>
<span class="sourceLineNo">100</span><a id="line.100">        public String getName() {</a>
<span class="sourceLineNo">101</span><a id="line.101">            return getObject().toString();</a>
<span class="sourceLineNo">102</span><a id="line.102">        }</a>
<span class="sourceLineNo">103</span><a id="line.103"></a>
<span class="sourceLineNo">104</span><a id="line.104">        @Override</a>
<span class="sourceLineNo">105</span><a id="line.105">        public boolean equals(Object o) {</a>
<span class="sourceLineNo">106</span><a id="line.106">            if (this == o) return true;</a>
<span class="sourceLineNo">107</span><a id="line.107">            if (o == null || getClass() != o.getClass()) return false;</a>
<span class="sourceLineNo">108</span><a id="line.108"></a>
<span class="sourceLineNo">109</span><a id="line.109">            ObjectPrincipal that = (ObjectPrincipal) o;</a>
<span class="sourceLineNo">110</span><a id="line.110"></a>
<span class="sourceLineNo">111</span><a id="line.111">            return object.equals(that.object);</a>
<span class="sourceLineNo">112</span><a id="line.112"></a>
<span class="sourceLineNo">113</span><a id="line.113">        }</a>
<span class="sourceLineNo">114</span><a id="line.114"></a>
<span class="sourceLineNo">115</span><a id="line.115">        public int hashCode() {</a>
<span class="sourceLineNo">116</span><a id="line.116">            return object.hashCode();</a>
<span class="sourceLineNo">117</span><a id="line.117">        }</a>
<span class="sourceLineNo">118</span><a id="line.118"></a>
<span class="sourceLineNo">119</span><a id="line.119">        public String toString() {</a>
<span class="sourceLineNo">120</span><a id="line.120">            return object.toString();</a>
<span class="sourceLineNo">121</span><a id="line.121">        }</a>
<span class="sourceLineNo">122</span><a id="line.122">    }</a>
<span class="sourceLineNo">123</span><a id="line.123">}</a>




























































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