springBoot和security实现不同用户登录

通过访问数据库,实现不同用户、不同角色登录系统。

以简单的表结构演示案例。

一  创建数据表

角色表   (role):

springBoot和security实现不同用户登录_第1张图片

用户表 (user):

springBoot和security实现不同用户登录_第2张图片

用户角色关系表(user_role):

springBoot和security实现不同用户登录_第3张图片

二  搭建项目结构

springBoot和security实现不同用户登录_第4张图片

三 编码实现

1)yml配置文件

server:
  servlet:
    context-path: /zmd
mybatis:
  type-aliases-package: com.zmd.pojo  # 批量设置别名
  mapper-locations: classpath:com/zmd/mapper/*.xml  # 设置mapper的路径
  configuration:
    auto-mapping-behavior: full # 设置全自动映射
    use-column-label: true # 设置别名可以做列名
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    username: root
    password: 123456
  thymeleaf:
    cache: false
    suffix: .html
  jackson:
    # 如果使用字符串星表示用这行格式
    date-format: yyyy-MM-dd
    # 设置为东八区时间
    timezone: GMT+8
    # 想要值为2016-01-01
    serialization:
      write-dates-as-timestamps: false
# 显示SQL语句
logging:
  level:
    com:
      zmd:
        mapper: debug

2)实体类(pojo)

user:

@Data
public class User {
    private Integer id;
    private String name;
    private String password;
    private List roles=new ArrayList<>();
}

role:

@Data
public class Role {
    private Integer id;
    private String name;
    private List users = new ArrayList();
}

3)mapper





    
    
    
        
        
        
            
        
    

在启动类中配置扫描:


@SpringBootApplication
@MapperScan("com.zmd.mapper")
public class Security1902Application {
    public static void main(String[] args) {
        SpringApplication.run(Security1902Application.class, args);
    }

4)service业务

通过重写方法,从当前登录账号对应的数据库数据中获取到账号角色等信息。


@Service
public class UserDetailsServiceImpl  implements UserDetailsService {
    @Resource
    UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Collection authorities = new ArrayList<>();
        User user = userMapper.getUser(username);
        System.out.println("service来了");
        if (user == null) {
            System.out.println("该用户不存在");
        } else {
            List roles = user.getRoles();
            for (Role r : roles) {
                System.out.println("角色:"+r.getName());
                authorities.add(new SimpleGrantedAuthority(r.getName()));
            }
            org.springframework.security.core.userdetails.User u = new org.springframework.security.core.userdetails.User(user.getName(), user.getPassword(), authorities);
            System.out.println("u:"+u);
            return u;
        }
        return null;
    }
}

5)配置类WebSecurityConfig


@Configuration
@EnableWebSecurity //启动安全框架
@EnableGlobalMethodSecurity(prePostEnabled = true)//开启注解级别方法权限控制
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsServiceImpl userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated()
                .and()
                .formLogin()  //指定支持基于表单的身份验证
                .loginPage("/login") //默认的登录路径
                .loginProcessingUrl("/loginCheck")//登录页面提交的路径,需要和页面的路径保持一致
                .defaultSuccessUrl("/logSuccess")//登录成功后跳转的路径
                .failureUrl("/error2")//登录失败后跳转的路径
                .usernameParameter("username")//获取页面的配置的用户名,和页面的值保持一致
                .passwordParameter("password")
                .permitAll()//路径不设权限
                .and()
                .csrf().disable();//阻止跨域请求伪造攻击

    }
    //用于对比密码
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new PasswordEncoder() {
            @Override
            public String encode(CharSequence charSequence) {
                return charSequence.toString();
            }

            @Override
            public boolean matches(CharSequence charSequence, String s) {
                return s.equals(charSequence.toString());
            }
        });
    }

    //静态请求要放行
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/webjars/**").antMatchers("/static/**");
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }


}

6)controller


@Controller
public class MyController {

    @RequestMapping("/login")
    public String login(){
        System.out.println("这是login。。。");
        return "login";
    }
    @RequestMapping("/logSuccess")
    public String logSuccess(){
        System.out.println("登录成功");
        return "index";
    }

    @RequestMapping("/error2")
    @PreAuthorize("hasAnyAuthority('admin','user')")
    public String error111(){
        return "error1";
    }


}

7)登录页面




    
    登录界面
    
    
    
    



忘记密码? 立即注册

四  运行测试

1)错误账号密码登录:

springBoot和security实现不同用户登录_第5张图片

登录失败,不会进行跳转。

2)登录成功

springBoot和security实现不同用户登录_第6张图片

springBoot和security实现不同用户登录_第7张图片

观察控制台:

小结

通过上述步骤,实现了用户登录。

该用户的账号和密码必须匹配数据表中数据,并且可以成功获取到该账号对应的角色,

以方便后续进行权限的相关处理。

 

欢迎留言评论,交流学习。

 

你可能感兴趣的:(java,spring,boot,mysql)