• security登录实战


    以下是一个基本的security登录实战代码示例,采用Java Spring框架:

    1. 配置security
    1. @Configuration
    2. @EnableWebSecurity
    3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
    4. @Autowired
    5. private UserDetailServiceImpl userDetailsService;
    6. @Override
    7. protected void configure(HttpSecurity http) throws Exception {
    8. http
    9. .authorizeRequests()
    10. .antMatchers("/", "/home", "/register").permitAll()
    11. .antMatchers("/admin").hasRole("ADMIN")
    12. .anyRequest().authenticated()
    13. .and()
    14. .formLogin()
    15. .loginPage("/login")
    16. .defaultSuccessUrl("/dashboard")
    17. .permitAll()
    18. .and()
    19. .logout()
    20. .permitAll();
    21. }
    22. @Autowired
    23. public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    24. auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    25. }
    26. @Bean
    27. public PasswordEncoder passwordEncoder() {
    28. return new BCryptPasswordEncoder();
    29. }
    30. }

    1. 创建UserDetailsService实现类
    1. @Service
    2. public class UserDetailServiceImpl implements UserDetailsService {
    3. @Autowired
    4. private UserRepository userRepository;
    5. @Override
    6. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    7. User user = userRepository.findByUsername(username);
    8. if (user == null) {
    9. throw new UsernameNotFoundException("Invalid username or password.");
    10. }
    11. return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user));
    12. }
    13. private Set getAuthorities(User user) {
    14. Set authorities = new HashSet<>();
    15. for (Role role : user.getRoles()) {
    16. authorities.add(new SimpleGrantedAuthority(role.getName()));
    17. }
    18. return authorities;
    19. }
    20. }

    1. 创建User实体和Role实体
    1. @Entity
    2. @Table(name = "users")
    3. public class User {
    4. @Id
    5. @GeneratedValue(strategy = GenerationType.IDENTITY)
    6. private Long id;
    7. @Column(name = "username", unique = true)
    8. private String username;
    9. @Column(name = "password")
    10. private String password;
    11. @ManyToMany(fetch = FetchType.EAGER)
    12. @JoinTable(
    13. name = "user_roles",
    14. joinColumns = @JoinColumn(name = "user_id"),
    15. inverseJoinColumns = @JoinColumn(name = "role_id"))
    16. private Set roles = new HashSet<>();
    17. // getters and setters
    18. }
    19. @Entity
    20. @Table(name = "roles")
    21. public class Role {
    22. @Id
    23. @GeneratedValue(strategy = GenerationType.IDENTITY)
    24. private Long id;
    25. @Column(name = "name")
    26. private String name;
    27. @ManyToMany(mappedBy = "roles")
    28. private Set users = new HashSet<>();
    29. // getters and setters
    30. }

    1. 创建登录页面
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Login Pagetitle>
    6. head>
    7. <body>
    8. <h1>Login Pageh1>
    9. <form th:action="@{/login}" method="post">
    10. <div>
    11. <label for="username">Username:label>
    12. <input type="text" id="username" name="username" autofocus="true"/>
    13. div>
    14. <div>
    15. <label for="password">Password:label>
    16. <input type="password" id="password" name="password"/>
    17. div>
    18. <div>
    19. <input type="checkbox" id="remember-me" name="remember-me"/>
    20. <label for="remember-me">Remember melabel>
    21. div>
    22. <button type="submit" class="btn btn-default">Loginbutton>
    23. form>
    24. body>
    25. html>

    1. 创建注册页面
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Register Pagetitle>
    6. head>
    7. <body>
    8. <h1>Register Pageh1>
    9. <form th:action="@{/register}" method="post">
    10. <div>
    11. <label for="username">Username:label>
    12. <input type="text" id="username" name="username" autofocus="true"/>
    13. div>
    14. <div>
    15. <label for="password">Password:label>
    16. <input type="password" id="password" name="password"/>
    17. div>
    18. <div>
    19. <label for="confirm-password">Confirm Password:label>
    20. <input type="password" id="confirm-password" name="confirm-password"/>
    21. div>
    22. <button type="submit" class="btn btn-default">Registerbutton>
    23. form>
    24. body>
    25. html>

    1. 创建控制器
    1. @Controller
    2. public class UserController {
    3. @Autowired
    4. private UserService userService;
    5. @GetMapping("/login")
    6. public String login() {
    7. return "login";
    8. }
    9. @GetMapping("/register")
    10. public String register() {
    11. return "register";
    12. }
    13. @PostMapping("/register")
    14. public String registerUser(UserDto userDto) {
    15. userService.save(userDto);
    16. return "redirect:/login";
    17. }
    18. @GetMapping("/dashboard")
    19. public String dashboard() {
    20. return "dashboard";
    21. }
    22. @GetMapping("/admin")
    23. public String admin() {
    24. return "admin";
    25. }
    26. }

    1. 创建服务类
    1. @Service
    2. public class UserServiceImpl implements UserService {
    3. @Autowired
    4. private UserRepository userRepository;
    5. @Autowired
    6. private PasswordEncoder passwordEncoder;
    7. @Override
    8. public void save(UserDto userDto) {
    9. User user = new User();
    10. user.setUsername(userDto.getUsername());
    11. user.setPassword(passwordEncoder.encode(userDto.getPassword()));
    12. Role role = new Role();
    13. role.setName("ROLE_USER");
    14. user.setRoles(Collections.singleton(role));
    15. userRepository.save(user);
    16. }
    17. }

    这是一个基本的security登录实战示例,你可以根据自己的需要进行修改和拓展。

  • 相关阅读:
    教你vue-router命令视图应该怎么玩
    ES6——尾递归优化
    C++ //练习 10.37 给定一个包含10个元素的vector,将位置3到7之间的元素按逆序拷贝到一个list中。
    基于Qt命令行处理XML文件读写
    PrestoSQL, PrestoDB 和 Trino
    Worthington核糖核酸酶B历史和化学性质说明
    视频技术笔记-色差分量
    温馨提示:不注意这几点,PDT(产品开发团队)就得散!
    JVM源码剖析之线程的创建过程
    01的token的年度总结
  • 原文地址:https://blog.csdn.net/Stephen_CY666/article/details/134299554