【问题标题】:requestMapping mistakenly calledrequestMapping 被错误调用
【发布时间】:2015-07-29 22:06:05
【问题描述】:

我似乎在配置 spring mvc 和 spring security 时遇到问题,因为它总是在控制器内部循环(试图获取静态内容)

SecurityConfiguration.java

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Inject
    public UserDetailsService userService;

    @Inject
    public void configureGlobal(AuthenticationManagerBuilder auth)throws Exception{
        auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
    }

  /*@Override
  public void configure(WebSecurity web) throws Exception {
    web.ignoring()
      .antMatchers();
  }//*/

  public void configure(HttpSecurity http) throws Exception{
        http
          .csrf().disable()
          .authorizeRequests()
          .antMatchers("/connect/**", "/**/*.{js,css,html}").permitAll()
          .anyRequest().authenticated()
          .and()
          .formLogin()
          .loginPage("/login").permitAll()
          .and().logout()
          .logoutUrl("/logout").permitAll();
    }
}

控制器

@Controller
class Main {
  @RequestMapping(name = "/login",method=RequestMethod.GET)
  public String index(@AuthenticationPrincipal User user):  {
    if(user != null){return "login";/*always enters here after login no matter the url*/}
    else{ return "redirect:/index";}

  }
}

问题在于,无论我给它的 url(例如 /pankackes)是否尝试使用该请求映射(使用调试器检查)

编辑 1 没提,但我的目录结构已经是这样了

src/
  main/
    resources/
      static/
        dist/
        styles/
        jspm_packages/
        index.html
      templates/
        login.html
    java/
      .../
        main.java
        ...

【问题讨论】:

  • 总是转发登录的问题吗?
  • 是的,这就是问题所在,它总是转发到“/login”
  • 登录的实现在哪里?
  • 是spring security默认的,在SecurityConfiguration.java的configureGlobal函数中
  • 请告诉我它是否有效

标签: spring-mvc spring-security spring-boot


【解决方案1】:

将您的静态文件移动到 resources/static 下的相应文件夹 - 这样您的树就会看起来像

src
  main
    resources
      static
        js
        css
        ...

这些文件将在您的根路径下可用,例如:

http://localhost:8080/css/filename.css

spring boot 将为您处理静态文件上的 permitAll。

关于 /pancakes - 你的所有路径都将被重定向到登录站点 "/connect/**", "/**/*.{js,css,html}"

【讨论】:

【解决方案2】:

你错过了身份验证管理器的实现,试试这个作为例子,(将它们添加到 spring security xml 文件中)

<authentication-manager alias="authenticationManager">
        <authentication-provider>
            <user-service>
                <user name="user1" password="user1Pass" authorities="ROLE_USER" />
                <user name="admin1" password="admin1Pass" authorities="ROLE_ADMIN" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

或者使用这个:

@Configuration
@EnableWebSecurity
public class HelloWebSecurityConfiguration
   extends WebSecurityConfigurerAdapter {

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) {
    auth
      .inMemoryAuthentication()
        .withUser("user").password("password").roles("USER");
  }
}

【讨论】:

  • 不,似乎只要我有@RequestMapping 注释,静态资产就不起作用,如果我删除@Controller 类我可以访问我的静态文件
  • 但你也没有使用登录机制
  • 我可以在示例中的控制器中登录 'if(user != null){return "login";} ' 它确实进入了。至于身份验证行 'auth.userDetailsS​​ervice( userService).passwordEncoder(passwordEncoder());'照顾它。
  • 用户名和密码存储在哪里?
  • 数据库,userService检查数据库中的用户名,并返回一个UserDetails的实现
猜你喜欢
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多