这不是“速成”,但以下方法应该适用于 Shiro 或您的 Grails 应用程序使用的任何安全框架。
在 web.xml 中,在任何现有元素之上添加以下<filter>
元素:
<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
在任何时候/monitoring/*
调用 url 模式时调用。
接下来,您需要MelodyFilter
在/src/java/com/your/package/MelodyFilter.java
.
在doFilter
方法体中,您可以调用 Grails 服务方法来执行任何所需的安全检查,如下所示:
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-melody:1.59.0 验证了这种技术在 Grails-2.3.6 中有效