根据《Java EE开发的颠覆者 Spring Boot 实战》来学习Spring Security,然后照着书上的代码去敲,发现了很多书上写和实际情况不一样的地方。
- 书上的User实体类还可以实现接口,而我如果实现接口UserDetails,一运行就会报错,解决办法是新创建一个MyUserDetails去继承User实体类,然后实现UserDetails接口。
- 书上说Spring Boot针对Spring Security有自动配置,其中包括忽略/css/、/js/、/images/等静态文件的拦截,然后书中的实战代码也并没有对这几个文件设置允许访问,依然可以引用bootstrap,可我在实际代码中发现并不可以!还是要给这几个文件路径进行匹配,然后允许所有用户访问,看下面的代码
http.authorizeRequests()
//允许所有用户访问"/","/jquery/**","/semantic/**","/css/**","/js/**","/images/**"
.antMatchers("/",
"/jquery/**",
"/semantic/**",
"/css/**",
"/js/**",
"/images/**",
"/fonts/**",
"/**/favicon.ico",
"/**").permitAll()
//其他请求需要登录认证
.anyRequest().authenticated()
如果不加上这段代码访问静态文件都成302,访问静态文件全都跳转到login去了。
但新的问题是加上这段代码后访问静态文件又变成404了,检查了几十遍路径没有错,然后在static文件夹下随便新建了一个txt文件去访问,也是404,最后解决办法看下面代码
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
重点是这里
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
需要在后面重新映射一下静态资源路径,自己觉得原因可能是Spring Boot默认的静态资源路径不知道被我怎么搞的失效了,怀疑和Spring Security有关,
而且在html文件中的引用方式也要改变,看代码
<link rel="stylesheet" type="text/css" th:href="@{/static/semantic/dist/semantic.min.css}">
<script type="text/javascript" th:src="@{/static/js/jquery.min.js}"></script>
<script type="text/javascript" th:src="@{/static/semantic/dist/semantic.min.js}"></script>
我是引用的semantic-ui,引用路径前面都要加上/static
,Spring Boot默认下是不需要的。