Spring安全 - 无法使用自己的登录表单

时间:2015-06-29 18:41:45

标签: spring spring-mvc spring-security

我尝试通过自己的表单登录spring security,我遇到了问题,我正在

404 -  The requested resource is not available on http://localhost:8080/SpringHibernateExample/j_spring_security_check

这是我的代码:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
       .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
       .and().formLogin();
       .loginPage("/login").defaultSuccessUrl("/admin/goods").failureUrl("/login?error")
            .usernameParameter("username").passwordParameter("password")        
       .and().logout().logoutSuccessUrl("/login")
       .and().csrf(); 
    }
}


@Controller
public class SecurityController {


    @RequestMapping(value = "/admins**", method = RequestMethod.GET)
    public ModelAndView adminPage() {

      ModelAndView model = new ModelAndView();
      model.addObject("title", "Spring Security Login Form - Database Authentication");
      model.addObject("message", "This page is for ROLE_ADMIN only!");
      model.setViewName("admin");
      return model;

    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public ModelAndView login(
            @RequestParam(value = "error", required = false) String error,
            @RequestParam(value = "logout", required = false) String logout) {

      ModelAndView model = new ModelAndView();
      if (error != null) {
        model.addObject("error", "Špatné uživatelské jméno!");
      }

      if (logout != null) {
        model.addObject("msg", "Byl jste úspěšně odhlášen.");
      }
      model.setViewName("login");

      return model;

    }

    //for 403 access denied page
    @RequestMapping(value = "/403", method = RequestMethod.GET)
    public ModelAndView accesssDenied() {

      ModelAndView model = new ModelAndView();

      //check if user is login
      Authentication auth = SecurityContextHolder.getContext().getAuthentication();
      if (!(auth instanceof AnonymousAuthenticationToken)) {
        UserDetails userDetail = (UserDetails) auth.getPrincipal(); 
        model.addObject("username", userDetail.getUsername());
      }

      model.setViewName("403");
      return model;

    }

}

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Prosvaly</title>
<style>
.error {
    padding: 15px;
    margin-bottom: 20px;
    border: 1px solid transparent;
    border-radius: 4px;
    color: #a94442;
    background-color: #f2dede;
    border-color: #ebccd1;
}

.msg {
    padding: 15px;
    margin-bottom: 20px;
    border: 1px solid transparent;
    border-radius: 4px;
    color: #31708f;
    background-color: #d9edf7;
    border-color: #bce8f1;
}

#login-box {
    width: 300px;
    padding: 20px;
    margin: 100px auto;
    background: #fff;
    -webkit-border-radius: 2px;
    -moz-border-radius: 2px;
    border: 1px solid #000;
}
</style>
</head>
<body onload='document.loginForm.username.focus();'>


    <div id="login-box">

        <h3>Zadejte jméno a heslo</h3>

        <c:if test="${not empty error}">
            <div class="error">${error}</div>
        </c:if>
        <c:if test="${not empty msg}">
            <div class="msg">${msg}</div>
        </c:if>

        <form name='loginForm'
          action="<c:url value='/j_spring_security_check' />" method='POST'>

        <table>
            <tr>
                <td>Jméno:</td>
                <td><input type='text' name='username'></td>
            </tr>
            <tr>
                <td>Heslo:</td>
                <td><input type='password' name='password' /></td>
            </tr>
            <tr>
                <td colspan='2'><input name="submit" type="submit"
                  value="Přihlásit" /></td>
            </tr>
          </table>

          <input type="hidden" name="${_csrf.parameterName}"
            value="${_csrf.token}" />

        </form>
    </div>

</body>
</html>


public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
   //do nothing
}


public class AppInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext container) throws ServletException {

        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(AppConfig.class);
        ctx.setServletContext(container);

        container.addListener(new ContextLoaderListener(ctx));

        ServletRegistration.Dynamic servlet = container.addServlet(
                "dispatcher", new DispatcherServlet(ctx));

        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");

        FilterRegistration.Dynamic fr = container.addFilter("encodingFilter",
                new CharacterEncodingFilter());
        fr.setInitParameter("encoding", "UTF-8");
        fr.setInitParameter("forceEncoding", "true");
        fr.addMappingForUrlPatterns(null, true, "/*");


    }

}

我尝试通过以下方式登录vwithout自己的表单设置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
       .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
       .and().formLogin()
       .and().logout().logoutSuccessUrl("/login");
    }
}

登录成功了,但登出时出现了同样的错误,我不知道原因:/

退出

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Prosvaly - admin</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css"
    href="<c:url value="/resources/admin/css/style.css" />" />
<link rel="stylesheet" type="text/css"
    href="<c:url value="/resources/admin/css/sdmenu.css" />" />
    <link rel="stylesheet" href="//code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="//code.jquery.com/ui/1.11.1/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script>
  $(function() {
    $( "#datepicker" ).datepicker();
  });
  </script>
  <script>
  $(function() {
    $( "#datepicker2" ).datepicker();
  });
  </script>
</head>

<body>
    <div id="header">
        <a href="goods" class="logo"><img
            src=<c:url value="/resources/admin/images/logo.jpg" />
            alt="prosvaly.cz" /></a>

        <div class="loginBlock">
            <img src=<c:url value="/resources/admin/images/top_bg.gif" /> alt=""
                width="218" height="12" />
            <form action="<c:url value="j_spring_security_logout" />" method="post" id="logoutForm">
                <input type="hidden" name="${_csrf.parameterName}"
                    value="${_csrf.token}" />
            </form>
            <script>
                function formSubmit() {
                    document.getElementById("logoutForm").submit();
                }
            </script>

            <c:if test="${pageContext.request.userPrincipal.name != null}">
                <h2>
                    Sekce: ${pageContext.request.userPrincipal.name} | <a
                        href="javascript:formSubmit()"> Odhlásit</a>
                </h2>
            </c:if>
            <img src=<c:url value="/resources/admin/images/bot_bg.gif" /> alt=""
                width="218" height="10" /><br />
        </div>
        <ul id="menu">
            <li><img src=<c:url value="/resources/admin/images/li.gif" />
                alt="" width="19" height="29" /></li>
        </ul>
    </div>

0 个答案:

没有答案