roller使用acegi做爲其認證模塊,acegi是比較成功的一個安全與認證模塊,相信很多項目中都有使用到。但是有些項目有自己的認證模塊又想集成roller做二次開發,這時可能acegi是必須砍掉的。
下面說說如何簡單去掉acegi,呵呵,不是很徹底!
通過搜索roller源代碼,發現好幾個類引用到acegi的東西,導致roller跟acegi耦合太強!roller啓動時RollerContext必須被加載,這個類繼承spring的ContextLoaderListener,所以roller啓動的時候會去加載spring的配置文件。不想說那麼多了,先說怎麼做吧。
1、在RollerContext類中註釋掉
initializeSecurityFeatures(servletContext);
2、寫一個Filter實現類,增加登陸邏輯處理。
public class AgFilter implements Filter{
private static Log log = LogFactory.getLog(AgFilter.class);
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
RollerSession rs = RollerSession
.getRollerSession((HttpServletRequest) req);
HttpServletRequest hs = (HttpServletRequest) req;
//認證邏輯處理
if (hs.getServletPath().indexOf("roller_j_security_check") > -1) {
String userName = req.getParameter("j_username");
try {
UserManager umgr = WebloggerFactory.getWeblogger()
.getUserManager();
User user = umgr.getUserByUserName(userName);
rs.setAuthenticatedUser(user);
req.getRequestDispatcher("/roller-ui/login-redirect.jsp").forward(req, res);
return ;
} catch (WebloggerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
chain.doFilter(req, res);
}
public void destroy() {
}
public void init(FilterConfig arg0) throws ServletException {
}
}
3、修改web.xml去掉acegi的filter
<filter> <filter-name>securityFilter</filter-name> <filter-class>org.apache.roller.weblogger.ui.core.filters.AgFilter</filter-class> <!-- <init-param>--> <!-- <param-name>targetClass</param-name>--> <!-- <param-value>org.acegisecurity.util.FilterChainProxy</param-value>--> <!-- </init-param>--> </filter>
基本上這樣就可以了。雖然roller啓動時會加載一些acegi的東西,但我們沒有用到也就無所謂了。這樣是最簡單的也是不徹底的。
相信利用roller進行二次開發有各種各樣的技巧、方法、思路,有的請分享一下!