【jfinal修仙系列】修改ShiroPlugin支持jfinal3.0
博客专区 > 冷冷gg 的博客 > 博客详情
【jfinal修仙系列】修改ShiroPlugin支持jfinal3.0
冷冷gg 发表于11个月前
【jfinal修仙系列】修改ShiroPlugin支持jfinal3.0
  • 发表于 11个月前
  • 阅读 41
  • 收藏 2
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 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

标签: Shiro JFinal Java
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 126
博文 104
码字总数 44854
作品 1
×
冷冷gg
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: