首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制对java旋律监视url的访问

限制对java旋律监视url的访问
EN

Stack Overflow用户
提问于 2015-06-09 18:05:43
回答 4查看 3.7K关注 0票数 7

有没有一种方法可以限制使用Shiro角色访问Grails中的Java插件生成的/monitoring url?

更新:有一些更多的细节。这是没有问题的,所以大多数Grails资源与shiro的安全。但是在java旋律插件的情况下,旋律过滤器似乎是在执行shiro过滤器之前执行的。这使西罗毫无用处。

有一些解决方案说,这可能是通过改变web.xml,但这不是一个迅速的成功,我(rdmueller)没有设法使它工作。web.xml插件似乎也承诺了一些帮助,但我不想添加另一个插件只是为了保护一个插件。

在web上发现的一些旧语句指出,这个问题应该已经通过使用这个文件中的loadAfter列表:https://github.com/javamelody/grails-melody-plugin/blob/master/GrailsMelodyGrailsPlugin.groovy解决了--但是这似乎只适用于旧版本的Grails。

Update2:为了更容易地提出解决方案,我创建了一个Grails2.2.4示例:https://github.com/rdmueller/SO30739581

只需克隆项目,执行grailsw run-app并导航到

代码语言:javascript
复制
http://localhost:8080/SO30739581/dbdoc

然后你就可以通过shiro获得登录屏幕。导航到

代码语言:javascript
复制
http://localhost:8080/SO30739581/monitoring

你可以在没有登录的情况下获得旋律屏幕:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-19 00:56:26

最后,我对web.xml进行了更改以进行HTTP身份验证。将此添加到web.config文件中。

代码语言:javascript
复制
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Monitoring</realm-name>
</login-config>
<security-role>
    <role-name>monitoring</role-name>
</security-role>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Monitoring</web-resource-name>
        <url-pattern>/monitoring</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>monitoring</role-name>
    </auth-constraint>
</security-constraint>

然后将用户和角色添加到tomcat-users.xml中。

代码语言:javascript
复制
<user username="yourusername" password="yourpassword" roles="monitoring"/>
票数 5
EN

Stack Overflow用户

发布于 2015-07-15 15:01:05

我假设您使用的是Grails 2.x,您可以这样硬编码:

代码语言:javascript
复制
<!-- language: java-->
// grails-app/conf/MonitoringFilters.groovy
import org.apache.shiro.SecurityUtils
class MonitoringFilters {

    def dependsOn = [ShiroSecurityFilters]

    def filters = {
        myMonitoringArea(uri: "/monitoring") {
           before = {      
              SecurityUtils.subject.hasRole('ADMIN')             
           }
        }       
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-04-11 21:58:32

这不是一个“快速命中”,但以下方法应该适用于Shiro或任何您的Grails应用程序使用的安全框架。

在web.xml中,在任何现有的<filter>元素之上添加以下元素:

代码语言:javascript
复制
<filter>
  <filter-name>melodyFilter</filter-name>
  <filter-class>com.your.package.MelodyFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>melodyFilter</filter-name>
  <url-pattern>/monitoring/*</url-pattern>
</filter-mapping>

这将在任何时候调用com.your.package.MelodyFilter url模式时调用/monitoring/*

接下来,您需要在MelodyFilter中创建一个/src/java/com/your/package/MelodyFilter.java类。

doFilter方法的主体中,您可以调用Grails服务方法来执行任何所需的安全检查,如下所示:

代码语言:javascript
复制
package com.your.package;

import com.my.grails.app.MyService;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class MelodyFilter implements Filter {

    @Override
    public void destroy() { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String uri = ((HttpServletRequest)request).getRequestURI();
        HttpSession session = ((HttpServletRequest)request).getSession(false);
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());
        // replace MyService with your actual service
        MyService myService = (MyService)ctx.getBean("myService");
        // replace isUserAuthorized with your actual service method;
        // session and uri params included to demonstrate how to pass them
        // your argument list can be whatever your service method requires
        boolean authorized = myService.isUserAuthorized(session, uri);
        if (authorized) { chain.doFilter(request,response); }
        else {
            request.setAttribute("error", "User is not authorized to access " + uri); 
            request.getRequestDispatcher("/someController/someAction").forward(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }
}

然后,只需实现myService.isUserAuthorized()来执行您想要的任何安全检查。

我已经在Grails-2.3.6和grails-旋律:1.59.0中验证了这一技巧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30739581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档