这几天学了一下spring security ,下面总结一下学到的内容, 以方便后面查看
spring security 最简单的用法就是在pom文件添加一下依赖就可以了
org.springframework.boot
spring-boot-starter-security
添加好后再重新启动系统后访问任何url会出现一个spring security 自带的登录页面,默认用户名
是user, 密码在spring boot启动日志有输出, 输入用户名密码就可以访问接口了
其次如果你想简单指定自己用户名和密码登录也非常简单,在application.properties 添加如下配置即可
#通过配置文件配置用户名和密码
#spring.security.user.name=abc
#spring.security.user.password=123456
后面再次接口,依然会跳转spring security 自带的登录页面, 输入abc,123456登录就可以访问接口了。
还可以通过写一个配置类指定用户名和密码
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 基于配置类设置用户名密码
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String password = encoder.encode("111");
auth.inMemoryAuthentication().withUser("zuo").password(password).roles("admin");
}
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
}
这样配置完以后也可以通过指定用户名和密码登录。
一般情况我们都有自己的登录页面,下面介绍自定义登录页面的配置
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailService;
// 自动登录
@Autowired
private DataSource dataSource;
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
jdbcTokenRepository.setDataSource(dataSource);
// 启动自动创建表
//jdbcTokenRepository.setCreateTableOnStartup(true);
return jdbcTokenRepository;
}
// 自动登录
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailService).passwordEncoder(password());
}
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
// 自定义登录页面、 访问路径不需要认证
protected void configure(HttpSecurity http) throws Exception {
// 配置退出的地址
http.logout().logoutUrl("/logout").logoutSuccessUrl("/login.html").permitAll();
// 配置没有权限访问的自定义页面
http.exceptionHandling().accessDeniedPage("/unauth.html");
http.formLogin() // 自定义自己编写的登录页面
.loginPage("/login.html") // 登录页面设置
.loginProcessingUrl("/user/login") // 登录的请求路径
//.defaultSuccessUrl("/test/index").permitAll() //登录成功后跳转的路径
.defaultSuccessUrl("/success.html").permitAll() //登录成功后跳转的路径
.and().authorizeRequests() // 定义哪些可以访问, 哪些不可以访问
.antMatchers("/","/test/hello", "/user/login").permitAll() //设置哪些路径可以直接访问 eg:"/test/hello, /user/login"不需要认证
// 当前登录用户只有admins的权限才能访问这个路径
//.antMatchers("/test/index").hasAuthority("admins")
//.antMatchers("/test/index").hasAnyAuthority("admins,manager")
//.antMatchers("/test/index").hasRole("sale")
.antMatchers("/test/index").hasAnyRole("sale,manager")
.anyRequest().authenticated() // 所有请求都需要认证
//设置自动登录
.and().rememberMe().tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(60) // 设置有效时长
.userDetailsService(userDetailService)
.and().csrf().disable();// 关闭csrf的防护
}
还要定义一个userDetailSerce
@Service("userDetailService")
public class MyUserDetailService implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 根据用户名查询数据库
QueryWrapper wrapper = new QueryWrapper<>();
// where条件指定
wrapper.eq("username", username);
Users user = userMapper.selectOne(wrapper);
// 判断
if(user == null){// 数据库没有用户名
throw new UsernameNotFoundException("用户名不存在!");
}
// 在userDetailsService里面设置权限
List auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");
//return new User("zzz", new BCryptPasswordEncoder().encode("123"),auths);
// 从查询数据库返回users对象得到用户名,密码返回
return new User(user.getUsername(), new BCryptPasswordEncoder().encode(user.getPassword()),auths);
}
}
以上就基本完成了认证和授权。
2.springcloud集成spring security的用法
首先学习了一下spring cloud的项目搭建
第一步要见一个spring boot的父工程, 然后再pom.xml添加
pom 就可以了。 后面再在父工程里添加子模块, 子模块直接新建maven项目就可以了。
项目搭建好就可以进行每个子模块的编写。
父工程依耐如下
1.8
3.0.5
2.0
2.7.0
0.7.0
1.2.28
2.8.2
20170516
0.2.2.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Hoxton.RELEASE
pom
import
org.springframework.cloud
spring-cloud-alibaba-dependencies
${cloud-alibaba.version}
pom
import
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus.version}
org.apache.velocity
velocity-engine-core
${velocity.version}
com.google.code.gson
gson
${gson.version}
io.springfox
springfox-swagger2
${swagger.version}
io.springfox
springfox-swagger-ui
${swagger.version}
io.jsonwebtoken
jjwt
${jwt.version}
com.alibaba
fastjson
${fastjson.version}
org.json
json
${json.version}
还要微服务的调用需要ApiGateway网关服务,阿里巴巴的nacos做服务发现
具体我的理解是,网关就是到nacos里找到对应的ip + 端口 进行转发, 建立起一个
桥梁。需要配置指定的路由规则,下面是网关服务对应的依赖,和配置
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-gateway
com.google.code.gson
gson
org.springframework.cloud
spring-cloud-starter-openfeign
# 服务名
spring.application.name=service-gateway
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8342
# 使用服务发现路由
spring.cloud.gateway.discovery.locator.enabled=true
# 配置路由规则
spring.cloud.gateway.routes[0].id=service-abc
# 设置路由uri lb://注册服务名称
spring.cloud.gateway.routes[0].uri=lb://service-abc
# 具体路径规则
spring.cloud.gateway.routes[0].predicates= Path=/*/abc/**
spring security 相关(jwt创建token)之类的就不在这里说了,内容太多了。 跟springboot 的差不多。 特别记录一下我不会的东西。