简介

  • 与Shiro比较出名的2个认证与授权框架。shiro上手更加简单,且只要引入包即可使用,但是功能也更加少。security需要配合spring框架
  • 通过安全框架,我们只需要少量的配置即可实现强大的功能
  • 本质也是AOP实现

    依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-security</artifactId>
    4. </dependency>

    配置

  • 默认在控制台输出自动生成的管理员用户,也可以自己配置

    spring.security.user.name=tom
    spring.security.user.password=123
    

    配置类

    要定义自己的策略,我们继承WebSecurityConfigurerAdapter类即可

    • AuthenticationManagerBuilder 定义认证策略
    • @EnableWebSecurity开启WebSecurity模式
  • 详细的看要继承的类的源码,里面关于代码示例都有
  • security的配置方法都是采用了链式编程,所以方法的顺序与是否选用都是很自由的

    内存认证与授权方式

    ```java @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override //这里表示这是对于http的配置 protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()  //这里是对于请求的权限控制
              .antMatchers("/").permitAll()  //所有人允许
              .antMatchers("/level1/**").hasRole("vip1")   //指定角色的允许访问的页面,多个路径使用,分割
              .antMatchers("/level2/**").hasRole("vip2")
              .antMatchers("/level3/**").hasRole("vip3");
    
     //http.formLogin();  开启登录功能,默认是使用security自带的登录页面,也可以配置自己的    下面配置了登录页的地址,用户名的对应,密码的对应,登录的处理路径,登录成功的跳转路径,登录跳转的页面的权限(这里permitall表示全部允许,不过我们一般在另外写在页面权限里,不在这里写)
    

    http.formLogin().loginPage(“/login”).usernameParameter(“user”).passwordParameter(“pwd”).loginProcessingUrl(“/login”).defaultSuccessUrl(“/“).permitAll();

      http.logout().logoutSuccessUrl("/login"); 开启注销功能并跳转页面
      // http.logout().logoutSuccessUrl("/login").deleteCookies().invalidateHttpSession(true);注销跳转并删除cookie,并让当前会话失效
    
          http.rememberMe().rememberMeParameter("remember");  开启记忆功能,是采用cookie实现的,值为前端记住控件的name属性
    
           http.csrf().disable();  //阻止csrf攻击
    

    }

@Override //下面是配置认证,有jdbcAuthentication和inMemoryAuthentication 2种,前者是数据库信息认证,后者是内存信息认证,即把用户信息都保存在代码里而不是数据库里,内存认证配置用户信息如下 protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) //下面配置了用户名,密码,加密方式,用户的角色 //从 security5.x 开始,强制性要求必须使用密码加密器(PasswordEncoder)对原始密码(注册密码)进行加密 .withUser(“cjh”).password(new BCryptPasswordEncoder().encode(“123123”)).roles(“vip2”,”vip3”) .and() .withUser(“root”).password(new BCryptPasswordEncoder().encode(“123123”)).roles(“vip1”,”vip2”,”vip3”) .and() .withUser(“guest”).password(new BCryptPasswordEncoder().encode(“123123”)).roles(“vip1”); } }

<a name="osUDp"></a>
## jdbc认证与授权方式

- 使用jdbc认证,我们只需要写好一个认证服务并实现`UserDetailsService`接口
```java
@EnableWebSecurity
public class SecurityConfig1 extends WebSecurityConfigurerAdapter {

    @Autowired   //我们自己写的认证服务
    private UserDetailsService userDetailsService;

    /**
     * 授权的
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页有相应权限才能访问
        //链式编程
        //请求授权的规则
        http.authorizeRequests()
                .antMatchers("/","/toLogin").permitAll()
                .antMatchers("/level1/**").hasAuthority("1")
                .antMatchers("/level2/**").hasAuthority("2")
                .antMatchers("/level3/**").hasAuthority("3");

        //没有权限,默认到登录页面
        http.formLogin()//自定义编写登录页面
                .loginPage("/login")//登录页面设置
                .loginProcessingUrl("/login")//登录访问路径
                .defaultSuccessUrl("/index")//登陆成功后的路径
                .usernameParameter("ugh")
                .passwordParameter("upwd");


        //防止网站攻击
        http.csrf().disable();//登出可能存在失败的原因
        //注销功能
        http.logout().logoutSuccessUrl("/toLogin");
        //开启记住我功能
        http.rememberMe().rememberMeParameter("remember");

    }

    /**
     * 认证的
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());  前一个Detail是配置方法,后一个Detail是自定义认证服务的bean

    }
}
@Service("userDetailsService")
public class UserService implements UserDetailsService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public UserDetails loadUserByUsername(String ugh) throws UsernameNotFoundException {
//从数据库中获取用户信息
        com.cao.pojo.User user = userMapper.findUserByGh(ugh);
        System.out.println(user);
        if (user == null) {
            //数据库中没有,认证失败
            throw new UsernameNotFoundException("该用户不存在");
        }

        //权限拆分   字符串拆分成数组
        String s = user.getUqx();
        String[] arr1 = s.split(",");

        List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(arr1);

        //
        return new User(user.getUgh(), new BCryptPasswordEncoder().encode(user.getUpsw()), authorities);
    }
}
@Data
public class User {
    private Integer uid;
    private String uname;
    private String ugh;
    private String upsw; //存密码
    private String uzw;
    private String uqx; //存角色信息
    private String ubmbh;
    private String inputp;
    private Date itime;
}