Spring Security benutzerdefinierte filter
Möchte ich anpassen, Spring security 3.0.5 und ändern login-URL /login anstelle von /j_spring_security_check.
Was ich tun müssen, ist, um zu ermöglichen, Anmeldung im "/" Verzeichnis und sichern "/admin/report.html" Seite.
Zunächst erstelle ich meinen eigenen filter mit tutorial und Spring Security source code:
public class MyFilter extends AbstractAuthenticationProcessingFilter {
private static final String DEFAULT_FILTER_PROCESSES_URL = "/login";
private static final String POST = "POST";
public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "j_username";
public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "j_password";
public static final String SPRING_SECURITY_LAST_USERNAME_KEY = "SPRING_SECURITY_LAST_USERNAME";
private String usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY;
private String passwordParameter = SPRING_SECURITY_FORM_PASSWORD_KEY;
protected MyFilter() {
super(DEFAULT_FILTER_PROCESSES_URL);
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response)
throws AuthenticationException, IOException, ServletException {
String username = obtainUsername(request);
String password = obtainPassword(request);
if (username == null) {
username = "";
}
if (password == null) {
password = "";
}
username = username.trim();
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
HttpSession session = request.getSession(false);
if (session != null || getAllowSessionCreation()) {
request.getSession().setAttribute(SPRING_SECURITY_LAST_USERNAME_KEY, TextEscapeUtils.escapeEntities(username));
}
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) req;
final HttpServletResponse response = (HttpServletResponse) res;
if (request.getMethod().equals(POST)) {
//If the incoming request is a POST, then we send it up
//to the AbstractAuthenticationProcessingFilter.
super.doFilter(request, response, chain);
} else {
//If it's a GET, we ignore this request and send it
//to the next filter in the chain. In this case, that
//pretty much means the request will hit the /login
//controller which will process the request to show the
//login page.
chain.doFilter(request, response);
}
}
protected String obtainUsername(HttpServletRequest request) {
return request.getParameter(usernameParameter);
}
protected String obtainPassword(HttpServletRequest request) {
return request.getParameter(passwordParameter);
}
}
nachdem Es ich mache die folgenden änderungen in xml -
<security:http auto-config="true">
<!--<session-management session-fixation-protection="none"/>-->
<security:custom-filter ref="myFilter" before="FORM_LOGIN_FILTER"/>
<security:intercept-url pattern="/admin/login.jsp*" filters="none"/>
<security:intercept-url pattern="/admin/report.html" access="ROLE_ADMIN"/>
<security:form-login login-page="/admin/login.jsp" login-processing-url="/login" always-use-default-target="true"/>
<security:logout logout-url="/logout" logout-success-url="/login.jsp" invalidate-session="true"/>
</security:http>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider>
<security:password-encoder hash="md5" />
<security:user-service>
<!-- peter/opal -->
<security:user name="peter" password="22b5c9accc6e1ba628cedc63a72d57f8" authorities="ROLE_ADMIN" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
<bean id="myFilter" class="com.vanilla.springMVC.controllers.MyFilter">
<property name="authenticationManager" ref="authenticationManager"/>
</bean>
und dann habe ich JSP mit meinem code.
<form action="../login" method="post">
<label for="j_username">Username</label>
<input type="text" name="j_username" id="j_username" />
<br/>
<label for="j_password">Password</label>
<input type="password" name="j_password" id="j_password"/>
<br/>
<input type='checkbox' name='_spring_security_remember_me'/> Remember me on this computer.
<br/>
<input type="submit" value="Login"/>
</form>
wenn Sie versuchen zu navigieren Sie zu " /admin/report.html ich bin Weiterleitung auf die login-Seite.
aber nach dem Absenden der Anmeldeinformationen ich bin immer:
HTTP Status 404 - /SpringMVC/login/
type Status report
message /SpringMVC/login/
description The requested resource (/SpringMVC/login/) is not available.
Sieht es aus wie ich haben problem in der Konfiguration, aber ich kann nicht herausfinden was dies verursacht.
Können Sie mir helfen?
action="../login"
?- das ist korrekt, ../login weil othrwise ich get /admin/login und ich brauche übergeordneten Ordner.
- Stammordner Ihrer Anwendung ist
/SpringMVC
?/SpringMVC/login/
korrekt ist/sollte verfügbar? - Ja, root ist /SpringMVC/, dann securet Ordner /SpringMVC/admin/report.html und dann login Ordner /SpringMVC/admin/login.jsp.
- Ich glaube mein problem ist in der xml-Datei. aber ich kann es herausfinden, was das problem ist, dass ich das Gefühl habe, dass mein filter nicht funktioniert, aber ich habe Ahnung, wie es richtig zu machen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass @Ischin richtig ist, sich Gedanken über die form action url. Versuchen Sie den vollständigen Pfad und sehen, ob das funktioniert. Wenn Sie es tut, Sie können von dort aus arbeiten, um herauszufinden, was nicht passen.
Die einzige andere Sache, die ich an denken kann, um zu überprüfen ist der filter-mapping in Sie web.xml. Da Sie auf die login-Seite müssen Sie diese einrichten, ich würde aber schauen, dass man nicht nur das abfangen von urls mit bestimmten Erweiterungen, etc.
Auch, nur als ein fyi, wenn Sie wollen, dass die Anfrage (sobald das login-Formular wird der Benutzer authentifiziert) zu gehen, um die zu sichernden Ressource (/admin/report.html in diesem Fall), dann sollten Sie das entfernen der form:login-immer-use-default-target="true". Wenn Sie dieses Kennzeichen setzen auf true bewirkt, dass die Anfrage immer auf die default-target-url, die in der Regel nicht, was Sie wollen. Aus der spring security docs:
Ich bin über 12 Monate zu spät auf diese, sondern um passen Sie die Anmelde-URL von der Spring Security-Formular anmelden, die Sie nicht brauchen, um eigene filter erstellen. Eines der Attribute des form-login-tag können Sie eine benutzerdefinierte URL. In der Tat, Sie können auch ändern Sie die Standard-j_username und j_password Feldnamen verwenden Attribute des form-login-tag. Hier ist ein Beispiel: