SpringSecurity-zero(示例)

SpringSecurity-zero(示例)

Scroll Down

突然发现目前还不会有关于权限控制的框架。了解了一下决定在shrio和SpringSecurity选择一下,然鹅我选择了后者。对啦这里有学习视频啦,需要的可以评论获取哦。

1. SpringSecurity能做什么,官网上乱七八糟的说了一堆,反正是没看懂。

  • 认证,简单来说就是通过你登录的账户知道你是谁。
  • 授权,给不同身份授予不同的权限。
  • 攻击防护,防止伪造身份对网站发起恶意攻击。

2. 引入SpringSecurity,这里采用springboot搭建

  • pom文件中引入SpringSecuirity
	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
  • 定义一个controller,包含三个重要路径
@Controller
public class TestSecurity {
    //访问跟路径直径进行跳转
    @RequestMapping("/")
    public String root(){
        return "redirect:/index";
    }
    //网站首页
    @RequestMapping("/index")
    public String index(){
        return "index";
    }
    //登录首页
    @RequestMapping("/login")
    public String login(){
        return "/login";
    }
    //只有拥有user身份的才能访问用户首页
    @RequestMapping("/user/user")
    public String userIndex(){
        return "user/user";
    }
}
  • 定义一个springsecurity配置类,需要使用@EnableWebSecurity和当前配置类继承WebSecurityConfigurerAdapter类,代表着当前这个类就是springsecurity配置类,并且复写其中的方法书写自己的规则
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         *  authorizeRequests()定义请求规则
         *  antMatchers()添加第一条规则,匹配"/"路径,permitAll()不需要权限即可访问
         *  antMatchers()添加第二条规则,匹配"/user/**"路径,hasRole("USER")只有拥有User权限的才能访问
         *  formLogin()添加登录规则,loginPage("/login")登录的地址为"/login",defaultSuccessUrl("/user")登录成功后默认跳转到页面"/user"
         *  logout()添加登出规则,logoutUrl("/logout")登出的地址为"/logout",logoutSuccessUrl("/login")登出成功之后默认跳转到页面"/login"
         */
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/user/**").hasRole("USER")
                .and()
                .formLogin().loginPage("/login").defaultSuccessUrl("/user")
                .and()
                .logout().logoutUrl("/logout").logoutSuccessUrl("/login");

    }
}
  • 添加一个用户,并赋予这个用户USER权限
    /**
     * 复写userDetailsService方法,并创建一个用户,name为zcf,密码为123,权限为USER
     * @return
     */
    @Override
    @Bean
    protected UserDetailsService userDetailsService() {
        User.UserBuilder users =User.withDefaultPasswordEncoder();
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(users.username("zcf").password("123").roles("USER").build());
        return manager;
    }

  • 定义一个UserController在这个controller中验证登录的用户
@Controller
public class UserController {
    @GetMapping("/user")
    public String user(@AuthenticationPrincipal Principal principal, Model model){
        model.addAttribute("username", principal.getName());
        return "user/user";
    }
}
  • 大致完成了一个登录验证,但是还有一些细节没搞懂,后续回过头来研究。