【jfinal修仙系列】修改ShiroPlugin支持jfinal3.0

在升级到jfinal3.0 以后,原有的shiroplugin不兼容,原来的 routes 是用通过JfinalConfig 注入

new ShiroPlugin(routes)

3.0 routes.getEntrySet() 不再支持。

修改ShiroPlugin 的 star方法


public boolean start() {
        Set<String> excludedMethodName = buildExcludedMethodName();
        ConcurrentMap<String, AuthzHandler> authzMaps = new ConcurrentHashMap<String, AuthzHandler>();
        //逐个访问所有注册的Controller,解析Controller及action上的所有Shiro注解。
        //并依据这些注解,actionKey提前构建好权限检查处理器。
        for (Routes routes : Routes.getRoutesList()) {
            for (Routes.Route route : routes.getRouteItemList()) {
                Class<? extends Controller> controllerClass = route.getControllerClass();

                String controllerKey = route.getControllerKey();

                // 获取Controller的所有Shiro注解。
                List<Annotation> controllerAnnotations = getAuthzAnnotations(controllerClass);
                // 逐个遍历方法。
                Method[] methods = controllerClass.getMethods();
                for (Method method : methods) {
                    //排除掉Controller基类的所有方法,并且只关注没有参数的Action方法。
                    if (!excludedMethodName.contains(method.getName())
                            && method.getParameterTypes().length == 0) {
                        //若该方法上存在ClearShiro注解,则对该action不进行访问控制检查。
                        if (isClearShiroAnnotationPresent(method)) {
                            continue;
                        }
                        //获取方法的所有Shiro注解。
                        List<Annotation> methodAnnotations = getAuthzAnnotations(method);
                        //依据Controller的注解和方法的注解来生成访问控制处理器。
                        AuthzHandler authzHandler = createAuthzHandler(
                                controllerAnnotations, methodAnnotations);
                        //生成访问控制处理器成功。
                        if (authzHandler != null) {
                            //构建ActionKey,参考ActionMapping中实现
                            String actionKey = createActionKey(controllerClass, method, controllerKey);
                            //添加映射
                            authzMaps.put(actionKey, authzHandler);
                        }
                    }
                }
            }
        }
        //注入到ShiroKit类中。ShiroKit类以单例模式运行。
        ShiroKit.init(authzMaps);
        /**
         * 设定登录,登录成功,未授权等url地址
         */
        ShiroKit.setLoginUrl(loginUrl);
        ShiroKit.setSuccessUrl(successUrl);
        ShiroKit.setUnauthorizedUrl(unauthorizedUrl);
        return true;
    }

OK shiro 就可以启动起来了。

扩展shiro标签支持 JfinalTemplate

jfinal提供了很简单的指令扩展,我们通过继承Directive来实现。


/**
 * Created by jie on 2017/4/3.
 * 用户已经身份验证/记住我登录后显示相应的信息。
 * #shiroUser()
 * body
 * #end
 */
public class ShiroUserTag extends SecureTag {

    public void exec(Env env, Scope scope, Writer writer) {
        if (getSubject() != null && getSubject().getPrincipal() != null)
            stat.exec(env, scope, writer);
    }

    public boolean hasEnd() {
        return true;
    }
}

在config中配置模板
me.addDirective("shiroUser", new ShiroUserTag());

则页面中可以

#shiroUser()
  登录认证以后显示
#end

其他标签定义看参考 http://git.oschina.net/log4j

转载于:https://my.oschina.net/giegie/blog/873642

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值