这几天学了一下spring security ,下面总结一下学到的内容, 以方便后面查看
- 首先springboot 集成spring security最简单的用法、
spring security 最简单的用法就是在pom文件添加一下依赖就可以了
<!-- Spring Security依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
添加好后再重新启动系统后访问任何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<Users> wrapper = new QueryWrapper<>();
// where条件指定
wrapper.eq("username", username);
Users user = userMapper.selectOne(wrapper);
// 判断
if(user == null){// 数据库没有用户名
throw new UsernameNotFoundException("用户名不存在!");
}
// 在userDetailsService里面设置权限
List<GrantedAuthority> 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添加
<packaging>pom</packaging>就可以了。 后面再在父工程里添加子模块, 子模块直接新建maven项目就可以了。
项目搭建好就可以进行每个子模块的编写。
父工程依耐如下
<properties>
<java.version>1.8</java.version>
<mybatis-plus.version>3.0.5</mybatis-plus.version>
<velocity.version>2.0</velocity.version>
<swagger.version>2.7.0</swagger.version>
<jwt.version>0.7.0</jwt.version>
<fastjson.version>1.2.28</fastjson.version>
<gson.version>2.8.2</gson.version>
<json.version>20170516</json.version>
<cloud-alibaba.version>0.2.2.RELEASE</cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!--Spring Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--mybatis-plus 持久层-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--swagger ui-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${json.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
还要微服务的调用需要ApiGateway网关服务,阿里巴巴的nacos做服务发现
具体我的理解是,网关就是到nacos里找到对应的ip + 端口 进行转发, 建立起一个
桥梁。需要配置指定的路由规则,下面是网关服务对应的依赖,和配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--gson-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
# 服务名
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 的差不多。 特别记录一下我不会的东西。