一、spring-security-web
1、引入jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
2、编写配置类
2.1、WebConfig
等同于spring-mvc.xml
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.mlj.indi")
public class WebConfig implements WebMvcConfigurer {
//视图解析器
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB‐INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
/*设置页面跳转
* 此处可设置一些没有业务逻辑的页面跳转
* */
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("redirect:/login");
}
}
2.2、SpringApplicationConfig
等同于applicationContext-*.xml
@Configuration
@ComponentScan(basePackages = "com.mlj.indi")
public class SpringApplicationConfig {
//在此配置除了Controller的其它bean,比如:数据库链接池、事务管理器、业务bean等。
}
3、初始化
3.1、初始化spring容器
public class SpringApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 指定applicationContext配置类
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] {SpringApplicationConfig.class};//指定rootContext的配置类
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class }; //指定servletContext的配置类
}
@Override
protected String[] getServletMappings() {
return new String [] {"/"}; //设置访问根目录
}
}
至此一个spirng工程已经搭建完成,接下来将spring secrurity集成进来
4、集成spring secrurity
4.1 Security配置类
编写Security配置类,注入两个bean:
1、PasswordEncoder主要做密码解析,PasswordEncoder是一个接口,security提供了内置的实现类,此处使用最简单的NoOpPasswordEncoder,不对密码进行加密,使用明文密码
2、UserDetailsService 主要用来实现从数据库加载用户信息,security会根据加载的用户信息与登录用户做比较
重写一个配置方法:
在 configure 方法中实现security 的拦截策略配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public UserDetailsService userDetailsService(){
InMemoryUserDetailsManager manager=new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
return manager;
}
//密码解析器
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
// 配置安全拦截机制
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
//拦截所有/test/请求需要经过身份验证,未收到拦截的路径可以直接访问,收到拦截的路径需登录后才能访问
.antMatchers("/*").authenticated()
//根据不同的权限访问不同的路径
.antMatchers("/test/r1").hasAuthority("p1")
.antMatchers("/test/r2").hasAuthority("p2")
//除/test打头的请求以外 的其他请求全部放行
.anyRequest().permitAll()
.and()
.formLogin()//允许表单登录
.successForwardUrl("/login-success");//自定义登录成功的页面地址
}
}
4.2 初始化SpringSecurity
public class SpringSecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
public SpringSecurityApplicationInitializer() {
/*往父类里面传入配置类的方式来初始化Security配置,*/
/*此种方式与在SpringApplicationInitializer的getRootConfigClasses
里传入配置类的方式作用相同都是初始化Security配置类*/
//super(WebSecurityConfig.class);
}
}
至此一个spring security 的web 架构已经搭建完成,测试一下,编写一个测试用的controller
@RestController
public class LoginController {
@RequestMapping(value = "/login-success",produces = {"text/plain;charset=UTF-8"})
public String loginSuccess(){
return " 登录成功!";
}
@GetMapping(value = "/r/test",produces = {"text/plain;charset=UTF-8"})
public String test(){
return " 访问资源1";
}
/**
* 测试资源1
* @return
*/
@GetMapping(value = "/test/r1",produces = {"text/plain;charset=UTF-8"})
public String r1(){
return " 访问资源1";
}
/**
* 测试资源2
* @return
*/
@GetMapping(value = "/test/r2",produces = {"text/plain;charset=UTF-8"})
public String r2(){
return " 访问资源2";
}
}
5、测试
4.1 在Security的配置类中定义了拦截机制以及两个测试用户,分别对两个测试用户赋予不同的角色,启动之后通过浏览器访问http://localhost:8080/springSecurity/login 打开登录地址即可看到测试效果
登录成功后 访问测试资源,无权访问的显示403,有权限的直接进入方法