这几天学了一下spring security ,下面总结一下学到的内容, 以方便后面查看

  1. 首先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 的差不多。 特别记录一下我不会的东西。