本人萌新,没事不要问我,我也不知道。
基本概念和说明:
1.SpringSecurity自带初始登陆页面,当然你也可以用你做的页面替换
2.本人暂时了解的SpringSecurity的功能为:
认证:可以理解为登陆,身份的认证,理解为是否登陆的判断,就是一个购物网站,你可以不登陆浏览商品,但是你在加入购物车的时候就是进行登陆判断,你没有登陆就会引导你登陆。
授权:判断你是什么身份,对应着什么功能。你如果是马云登陆淘宝,那么你可以设置菜单,设置商品等。如果你是客户登陆淘宝,那你就只能浏览和购买。
3.本次演示不连接数据库,就是单纯的演示SpringSecurity,不整复杂,复杂了我也懵了。
本次演示步骤:
- 添加依赖
- 配置application.properties文件
- 完成配置类
- 直接运行
被红圈包起来的就是这次要弄的
直接开始:
1.添加依赖
<!--spring security安全框架,身份识别-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.配置application.properties文件
注意:这里说明一下,我创建项目的时候选择的是,SpringBoot+MySQL+mybatis,所以这里需要配置数据库,不然就报错。。。。。。
spring.datasource.url=jdbc:mysql:///localhost:3306/ssm001?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=classpath:mapper/*.xml
#配置视图解析器
#访问地址前缀
spring.mvc.view.prefix=/WEB-INF/views
#访问地址后缀
spring.mvc.view.suffix=.jsp
#工程路径
server.servlet.context-path=/
#端口
server.port=8080
3.完成配置类(下面是两个配置类和一个Controller类,你们要用记得改包名和类名)
package com.example.demo4.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//SpringMVC配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/").setViewName("redirect:/login");
}
}
package com.example.demo4.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
//Security配置类
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
// 定义用户信息服务(查询用户信息)
@Bean
public UserDetailsService userDetailsService(){
// 内存的方式
InMemoryUserDetailsManager manager =new InMemoryUserDetailsManager();
// manager.createUser(User.withUsername("模拟数据库中取出的用户名").password("模拟数据库中取出的密码").authorities("数据库中取出的权限").build());
manager.createUser(User.withUsername("admin").password("admin").authorities("p1").build());
return manager;
}
// 密码编码器,NoOpPasswordEncoder字符串比较,没有加密80
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
// 安全拦截机制(核心)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 设置需要拦截的地址,和对应的权限(/r/r1是地址,p1是权限)
// .antMatchers("/r/r1").hasAuthority("p1")
// .antMatchers("/r/r2").hasAuthority("p2")
// 设置所有在/r/下面的地址全部都要认证通过
.antMatchers("/r/**").authenticated()
// 除了上述/r/下面的地址,其他的都不需要认证
.anyRequest().permitAll()
.and()
// 允许表单登陆
.formLogin()
// 自定义登陆成功的页面地址
.successForwardUrl("/login-success");
}
// @Override
// protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
// }
}
package com.example.demo4.config;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/")
public class SecurityController {
@RequestMapping(value = "login-success",produces = {"text/plain;charset=UTF-8"})
public String loginSuccess(){return "登陆成功;";}
@RequestMapping(value = "/r/r1",produces = {"text/plain;charset=UTF-8"})
public String r1(){return "资源1;";}
@RequestMapping(value = "/r/r2",produces = {"text/plain;charset=UTF-8"})
public String r2(){return "资源2;";}
}
4.开始运行