Hi again,
I don't want to throw you in the wrong track. Im just sharing my experience
so thread lightly and anyone feel free to comment.

If you dont have a web.xml or dont have access to it as you have mentioned
you can try something like this
from czetsuya-tech jee 6 aproach to shiro
<http://czetsuya-tech.blogspot.com.ar/2012/10/how-to-integrate-apache-shiro-with.html#.V6yorvnhCUk>

public class SessionIdHandler implements SOAPHandler<SOAPMessageContext> {
static final String META_INF_HANDLERS_XML = "/META-INF/handlers.xml";

private static final String THREAD_STATE = "threadState";
private static final Logger log = LoggerFactory
.getLogger(SessionIdHandler.class);
// @Inject SecurityProducer sProducer;

// SessionIdHandler(){
//// sProducer = (SecurityProducer) BeanProvider
//// .lookupResource(BeanProvider.SECURITY_PRODUCER_RESOURCE);
// }
/**
* SOAP Request
*
* <?xml version="1.0" encoding="UTF-8"?><S:Envelope
* xmlns:S="http://schemas.xmlsoap.org/soap/envelope/";> <S:Header/> <S:Body>
* <ns2:logout xmlns:ns2="http://service.ursula.com/";>
* <session_id>14f92165-64bd-4783-b111-7945012dd607</session_id>
* </ns2:logout> </S:Body> </S:Envelope>
*/
public boolean handleMessage(SOAPMessageContext mc) {
Boolean outbound = (Boolean) mc
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!outbound) {
System.out.println("SessionIdHandler Inbound soap Message");
try {
SecurityInterceptor.initSecurityManager();// se asegura de que se haya
inicializado el SecurityManager
SecurityManager sm = SecurityUtils.getSecurityManager();
Builder builder = (new Subject.Builder(sm));
Session session=null;
final SOAPMessage message = mc.getMessage();
final SOAPBody body = message.getSOAPBody();
NodeList element = body
.getElementsByTagName(LoginService.SESSION_ID_PARAM);
if (element.item(0) != null) {
System.out.println("SessionIdHandler Message has sessionId param");
String sessionId = element.item(0).getTextContent();
try{//trato de crear la session a partir del sessionId
 SessionKey sK = new DefaultSessionKey(sessionId);
  session =sm.getSession(sK);
 if(session == null){
 System.out.println("Session does not exist");
return false;
 } else {//la session se creo correctamente
 builder.sessionCreationEnabled(false);
 builder.session(session);
 }
}catch(SessionException se){//no se pudo crear la session a partir del
session id
System.out.println("sm.getSession(sK);= "+session+"
"+se.getClass().getSimpleName()+" "+ se.getMessage());
return false;
}
} else {
System.out.println("SessionIdHandler Message doesn't have sessionId param");
System.out.println("binding a new subject to the thread");
builder.sessionCreationEnabled(true);
}
*Subject subject = builder.buildSubject();*

* ThreadState threadState = new SubjectThreadState(subject);*
* threadState.bind();*
* mc.put(THREAD_STATE, threadState);// pongo el threadstate en el context
para liberarlo a la salida*
} catch (SOAPException e) {
log.info("SOAPException  = " + e.getMessage());
return false;
}
} else {// Cuando el mensaje es de salida aprobecho para limpiar el
threadstate.
ThreadState threadState = (ThreadState) mc.get(THREAD_STATE);
if (threadState != null) {
threadState.clear();
}
}

return true;
}

public Set<QName> getHeaders() {
return Collections.emptySet();
}

public void close(MessageContext mc) {
}

public boolean handleFault(SOAPMessageContext mc) {
return true;
}
}


@Interceptor
public class SecurityInterceptor {

private Logger log = LoggerFactory.getLogger(SecurityInterceptor.class);
private static SecurityManager securityManager=null;

@PostConstruct
public void interceptPostConstruct(InvocationContext ctx) {
initSecurityManager();
}
*public static void initSecurityManager(){*
* if(securityManager==null){//inicializando securityManager*
* String  iniFile
=SecurityInterceptor.class.getResource("/META-INF/shiro.ini").toExternalForm();//ok!*
* securityManager = new IniSecurityManagerFactory(*
* iniFile).getInstance();*
* SecurityUtils.setSecurityManager(securityManager);//Esto lo agrega como
una referencia estatica de SecurityUtils. si lo corro mas de una vez se
pierden las sessiones. *
* }*
* }*
@PreDestroy
private void shutdown() {  }

@AroundInvoke
public Object interceptGet(InvocationContext ctx) throws Exception {
Subject subject = SecurityUtils.getSubject();
// log.info("SecurityInterceptor.interceptGet Securing )"
// +  ctx.getClass().getSimpleName() +" "+ ctx.getMethod());

final Class<? extends Object> runtimeClass = ctx.getTarget().getClass();

// Check if user is authenticated
boolean requiresAuthentication = false;
try { // check method first
Annotation a = ctx.getMethod().getAnnotation(
RequiresAuthentication.class);
if (a != null) {
// log.info("Method " + ctx.getMethod().getName()
// + " requires authentication.");// Annotation: " + a);
requiresAuthentication = true;
}

} catch (NullPointerException e) {
requiresAuthentication = false;
}

if (!requiresAuthentication) { // then check class level
try {
if (runtimeClass != null) {
Annotation a = runtimeClass
.getAnnotation(RequiresAuthentication.class);
if (a != null) {
// log.info("Class " + ctx.getClass().getName()
// + " requires authentication ");
requiresAuthentication = true;
}
} else {
//log.info("runtime Class is null");
throw (new NullPointerException());
}

} catch (NullPointerException e) {
requiresAuthentication = false;
}
}

if (requiresAuthentication) {
log.info("[security] checking for authenticated user.");
try {
if (!subject.isAuthenticated()) {
System.out.println("subject.isAuthenticated es false entoces respondo
AuthorizationException");
log.info("[security] user not authenticated.");
throw new AuthorizationException();
}else{
log.info("OK!! subject is authenticated");
}
} catch (Exception e) {
log.info("Access denied - {}: {}" + e.getClass().getName()
+ e.getMessage());
throw e;
}
}
/************************************************************/

// check if user has roles
boolean requiresRoles = false;
List<String> listOfRoles = null;

try { // check method first
RequiresRoles roles = ctx.getMethod().getAnnotation(
RequiresRoles.class);
listOfRoles = Arrays.asList(roles.value());
requiresRoles = true;
} catch (NullPointerException e) {
requiresRoles = false;
}

if (!requiresRoles || listOfRoles == null) { // check class
try {
RequiresRoles roles = runtimeClass
.getAnnotation(RequiresRoles.class);
listOfRoles = Arrays.asList(roles.value());
requiresRoles = true;
} catch (NullPointerException e) {
requiresRoles = false;
}
}

if (requiresRoles && listOfRoles != null) {
log.info("[security] checking for roles.");
try {
boolean[] boolRoles = subject.hasRoles(listOfRoles);
boolean roleVerified = false;
for (boolean b : boolRoles) {
if (b) {
roleVerified = true;
break;
}
}
if (!roleVerified) {
throw new javax.ejb.EJBException(
"Access denied. User doesn't have enough privilege Roles:"
+ listOfRoles + " to access this page.");
// throw new AuthorizationException(
// "Access denied. User doesn't have enough privilege Roles:"
// + listOfRoles + " to access this page.");
}
} catch (Exception e) {
log.info("Access denied - {}: {}" + e.getClass().getName()
+ e.getMessage());
throw e;
}
}
/************************************************************/

// and lastly check for permissions
boolean requiresPermissions = false;
List<String> listOfPermissionsString = null;

try { // check method first
RequiresPermissions permissions = ctx.getMethod().getAnnotation(
RequiresPermissions.class);
listOfPermissionsString = Arrays.asList(permissions.value());
requiresPermissions = true;
} catch (NullPointerException e) {
requiresPermissions = false;
}

if (!requiresPermissions || listOfPermissionsString == null) {
// check class
try {
RequiresPermissions permissions = runtimeClass
.getAnnotation(RequiresPermissions.class);
listOfPermissionsString = Arrays.asList(permissions.value());
requiresPermissions = true;
} catch (NullPointerException e) {
requiresPermissions = false;
}
}

if (requiresPermissions && listOfPermissionsString != null) {
log.info("[security] checking for permissions.");
List<Permission> listOfPermissions = new ArrayList<Permission>();
for (String p : listOfPermissionsString) {
listOfPermissions.add((Permission) new WildcardPermission(p));
}
try {
boolean[] boolPermissions = subject
.isPermitted(listOfPermissions);
boolean permitted = false;
for (boolean b : boolPermissions) {
if (b) {
permitted = true;
break;
}
}
if (!permitted) {
throw new AuthorizationException(
"Access denied. User doesn't have enough privilege Permissions:"
+ listOfRoles + " to access this page.");
}
} catch (Exception e) {
log.info("Access denied - {}: {}" + e.getClass().getName()
+ e.getMessage());
throw e;
}
}

return ctx.proceed();
}

}

On Thu, Aug 11, 2016 at 1:27 PM, 张云 <[email protected]> wrote:

> Thank you for your reply.
> But I don't have the permission to edit web.xml or write a
> WebApplicationIntializer.
> I go around this by wtriting a spring intial izing bean to load Shiro's
> environment and register the shiro filter. It works for
>
> /demo = authc
>
> When I request /demo, It redirct me to the loginUrl
>
> Maybe The problem is that I don't config shiro filter with the four
> Dispachers.
>
> Thanks again.
> By the way, do you known where the security manager is bound to
> ThreadContex ?
>
>
>
> 发自 网易邮箱大师 <http://u.163.com/signature>
> On 08/12/2016 00:12, Tomas Lund Petersen <[email protected]> wrote:
>
> Hi,
> Im not an expert but i wanted to give you a quick reply.
> I think its in the webFilter. But it depends of your configuration.
>
> take a look at http://shiro.apache.org/webapp-tutorial.html
> you should have something like this in your web.xml
>
> 1b: Enable Shiro in web.xml
>
> While we have a shiro.ini configuration, we need to actually *load* it
> and start a new Shiro environment and make that environment available to
> the web application.
>
> We do all of this by adding a few things to the existing
> src/main/webapp/WEB-INF/web.xml file:
>
> <listener>
>     
> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
> </listener>
>
> <filter>
>     <filter-name>ShiroFilter</filter-name>
>  *   <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>*
> </filter>
>
> <filter-mapping>
>     <filter-name>ShiroFilter</filter-name>
>     <url-pattern>/*</url-pattern>
>     <dispatcher>REQUEST</dispatcher>
>     <dispatcher>FORWARD</dispatcher>
>     <dispatcher>INCLUDE</dispatcher>
>     <dispatcher>ERROR</dispatcher>
> </filter-mapping>
>
>
> On Thu, Aug 11, 2016 at 12:19 PM, 张云 <[email protected]> wrote:
>
>> hi,all
>>     I use shiro with spring and configure ShiroFilterFactoryBean without
>> any customized filters.
>>          I set the filterChainDefinition:
>>
>> /sys/menu = user
>>
>> When I access the url, I think it will redirect me to loginUrl. But he
>> pass the request and throw the exception where SecurityUtils.getSubject is
>> called.
>>
>> I step into the call, and find the exception is thrown by the
>> ThreadContex.getSecurityManager.
>>
>> I want to know where the security manager is bound to ThreadContex? Or if
>> I made a wrong configuration?
>>
>> Thx.
>>
>> 发自 网易邮箱大师 <http://u.163.com/signature>
>>
>>
>>
>
>
>

Reply via email to