jfinal 中Shiro初始化有缺陷

在 config中

   @Override
   public void configRoute(Routes routes) {
       this.routes = routes;
       routes.add("/", IndexController.class);
       routes.add(new FrontRoutes());
       routes.add(new AdminRoutes());

   }

 the.routes 中 只能获取到  indexcontroller.class    

不能获取  new FrontRoutes() 和 new AdminRoutes() 的 route

shiro start 中 routes.getRouteItemList() 获取的 routes

只有 indexcontroller 一个


导致 shiro 不能完美集成  


评论区

zzhkiller

2017-03-16 15:09

@JFinal 编辑器用的很不爽

JFinal

2017-03-16 15:23

可以支持,参考一下这个贴子:http://www.jfinal.com/share/224

编辑器有啥推荐的不?

zzhkiller

2017-03-16 15:24

@JFinal 就是上面这个帖子有缺陷
导致 shiro 中RequiresRoles 等方法 无效

JFinal

2017-03-16 15:26

@zzhkiller 联系一下贴子的作者看看

zzhkiller

2017-03-16 15:39

@JFinal 回复他了

EATI001

2017-03-16 16:44

@zzhkiller 没问题的,是可以拿的,你再看下我把全部的步骤了相应的代码也全站出来。

EATI001

2017-03-16 16:52

@zzhkiller 这个要配置,shrio.ini的访问规则,shiro.ini中的myRealm 的ShrioDbRealm这个类,这个是登录授权的处理类,如角色添加这片段代码
protected void authRole(int id, SimpleAuthorizationInfo info) {
List roleList = RoleService.me.byUid(id);
if (!sl.isEmpty(roleList)) {
for (Record role : roleList) {
info.addRole(role.get("name"));
authUrl(role.get("id"), info);
}
}
}
在界面如:
#if(shiro.hasRole("admin"))
#end
另外this.routers = routers; 放在最上面或最下面都不受影响的,详细的操作,
跑这看:http://www.jfinal.com/share/224

zzhkiller

2017-03-16 20:40

@EATI001 @EATI001
for (Routes.Route route : routes.getRouteItemList()) {

Class controllerClass = route.getControllerClass();

String controllerKey = route.getControllerKey();

// 获取Controller的所有Shiro注解。
List 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 methodAnnotations = getAuthzAnnotations(method);
//依据Controller的注解和方法的注解来生成访问控制处理器。
AuthzHandler authzHandler = createAuthzHandler(
controllerAnnotations, methodAnnotations);
//生成访问控制处理器成功。
if (authzHandler != null) {
//构建ActionKey,参考ActionMapping中实现
String actionKey = createActionKey(controllerClass, method, controllerKey);
//添加映射
authzMaps.put(actionKey, authzHandler);
}
}
}
} 其中 获取不到 routes.getRouteItemList() new FrontRoutes() 的action

zzhkiller

2017-03-16 20:44

@EATI001 @JFinal 我看了源码 发现 shiro 应该不支持的,
/**
* Add Routes
*/
public Routes add(Routes routes) {
routes.config();
routesList.add(routes);
return this;
}

/**
* 构造函数
* @param routes 路由设定
*/
public ShiroPlugin(Routes routes){
this.routes = routes;
}

这个改成
/**
* 构造函数
* @param routes 路由设定
*/
public ShiroPlugin(LIST routes){
this.routes = routes;
}


ShiroPlugin 插件 改成 list 遍历 每一个 routes 应该就可以了

zzhkiller

2017-03-17 09:47

@EATI001
昨天忘了 回复 已经 解决 加这一行就可以
for (Routes routes: Routes.getRoutesList()) { }@JFinal

max011

2017-03-18 17:38

http://ueditor.baidu.com/website/ 百度的ueditor这个我们有些项目再用

EATI001

2017-03-19 12:58

@zzhkiller 我重新调整了下ShiroPlugin的start获取路由这块:
/**
* 启动插件
*/
public boolean start() {
Set excludedMethodName = buildExcludedMethodName();
ConcurrentMap authzMaps = new ConcurrentHashMap();
//逐个访问所有注册的Controller,解析Controller及action上的所有Shiro注解。
//并依据这些注解,actionKey提前构建好权限检查处理器。
for (Routes routes : getRoutesList()) {
for (Routes.Route route : routes.getRouteItemList()) {
Class controllerClass = route.getControllerClass();

String controllerKey = route.getControllerKey();

// 获取Controller的所有Shiro注解。
List 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 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);

// ShiroKit.init(jdbcAuthzService, authzMaps, false);
/**
* 设定登录,登录成功,未授权等url地址
*/
ShiroKit.setLoginUrl(loginUrl);
ShiroKit.setSuccessUrl(successUrl);
ShiroKit.setUnauthorizedUrl(unauthorizedUrl);
return true;
}

private List getRoutesList() {
List routesList = Routes.getRoutesList();
List ret = new ArrayList(routesList.size() + 1);
ret.add(routes);
ret.addAll(routesList);
return ret;
},Shiro完成权限控制是在ShrioInterceptor来做的。

EATI001

2017-03-19 12:59

@zzhkiller 加了一层for (Routes routes : getRoutesList())

JFinal

2017-03-19 17:33

@EATI001 以前的那个贴子中也改一下哈,这样后来的小伙伴们就不会碰到问题了

EATI001

2017-03-19 21:46

@JFinal 修改了。

JFinal

2017-03-19 22:25

@EATI001 感谢支持 ^_^

雷老虎

2017-11-14 11:25

有一点问题,这样没有通过Routes方式添加的路由就监控不到了。我的改造方式是在原有的循环外套一层:
List allRoutes = Routes.getRoutesList();
// 构造变量ret的目的是不修改allRoutes,会造成key重复的情况
List ret = new ArrayList(allRoutes.size() + 1);
ret.add(routes); // 把没有通过Routes方式添加的也纳入插件监控
ret.addAll(allRoutes);
// 原插件没有这个外层循环,会导致通过add(new Routes())方式添加的路由无法监控的情况
for (Routes routes: ret) {
......

热门反馈

扫码入社