Package juzu.plugin.shiro.impl

Source Code of juzu.plugin.shiro.impl.ShiroDescriptor

/*
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package juzu.plugin.shiro.impl;

import java.util.Arrays;

import juzu.Response;
import juzu.Scope;
import juzu.impl.common.JSON;
import juzu.impl.inject.BeanDescriptor;
import juzu.impl.plugin.ServiceContext;
import juzu.impl.plugin.ServiceDescriptor;

import juzu.impl.request.Stage;
import org.apache.shiro.mgt.SecurityManager;

/**
* @author <a href="mailto:haithanh0809@gmail.com">Nguyen Thanh Hai</a>
* @version $Id$
*
*/
public class ShiroDescriptor extends ServiceDescriptor {
  /** . */
  private final ShiroAuthorizor authorizer;

  /** . */
  private final ShiroAuthenticator authenticater;

  /** . */
  private final BeanDescriptor bean;
 
  /** .*/
  private ServiceContext context;

  ShiroDescriptor(ServiceContext context) {
    JSON config = context.getConfig();
    this.authenticater = new ShiroAuthenticator(config.get("rememberMe") != null ? true : false);
    this.authorizer = new ShiroAuthorizor();
    this.context = context;
    this.bean =
      BeanDescriptor
        .createFromProvider(SecurityManager.class, Scope.SESSION, null, new SecurityManagerProvider(config));
  }

  public JSON getConfig() {
    return context.getConfig();
  }
 
  public ServiceContext getContext() {
    return context;
  }

  @Override
  public Iterable<BeanDescriptor> getBeans() {
    return Arrays.asList(bean);
  }

  public Response invoke(Stage.Handler stage) {
    //
    String methodId = stage.getRequest().getHandler().getHandle().toString();
    String controllerId = methodId.substring(0, methodId.indexOf('#'));
    methodId = methodId.substring(controllerId.length() + 1);
    JSON controllerJSON = getConfig().getJSON(controllerId);
    if (controllerJSON == null) {
      return stage.invoke();
    }

    //
    JSON methodsJSON = controllerJSON.getJSON("methods");
    JSON methodJSON;

    if (controllerJSON.get("require") != null) {
      Response resp = authorizer.isAuthorized(stage, controllerJSON);
      if (resp != null) {
        return resp;
      } else {
        if (methodsJSON == null) {
          return stage.invoke();
        }

        methodJSON = methodsJSON.getJSON(methodId);
        if (methodJSON == null) {
          return stage.invoke();
        }

        return doInvoke(stage, methodJSON);
      }
    }

    if (methodsJSON == null) {
      return stage.invoke();
    }

    methodJSON = methodsJSON.getJSON(methodId);
    if (methodJSON == null) {
      return stage.invoke();
    }

    return doInvoke(stage, methodJSON);
  }

  private Response doInvoke(Stage.Handler request, JSON json) {
    Response resp = authorizer.isAuthorized(request, json);
    if (resp != null) {
      return resp;
    } else {
      if ("login".equals(json.get("operator"))) {
        return authenticater.doLogin(request);
      } else if ("logout".equals(json.get("operator"))) {
        return authenticater.doLogout(request);
      } else {
        return request.invoke();
      }
    }
  }
}
TOP

Related Classes of juzu.plugin.shiro.impl.ShiroDescriptor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.