spring security 学习总结

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

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

你可能感兴趣的:(笔记,大数据,java,spring,boot)