SpringSecurity应用浅学

导引:

什么是企业架构?什么是企业架构框架?

我的理解:企业架构实际上是人与物的联系。

企业架构框架实际是企业应用系统提供的解决方案。

SpringSecurity:

 基于Spring的企业应用系统提供的安全访问控制方案的安全框架。它主要利用Spring中配置的Bean,利用SpringIoC,DI和AOP(面向切面编程)功能,提供安全访问控制。

1.1认证流程业务分析:

1.2Spring Security 架构设计

其中:

绿色部分是认证过滤器,需要我们自己配置,可以配置多个认证过滤器。认证过滤器可以使用 Spring Security 提供的认证过滤器,也可以自定义过滤器(例如:短信验证)。认证过滤器要在 configure(HttpSecurity http)方法中配置,没有配置不生效。下面会重点介绍以下三个过滤器:

UsernamePasswordAuthenticationFilter 过滤器:该过滤器会拦截前端提交的 POST 方式的登录表单请求,并进行身份认证。

BasicAuthenticationFilter:检测和处理 http basic 认证。

ExceptionTranslationFilter 过滤器:该过滤器不需要我们配置,对于前端提交的请求会直接放行,捕获后续抛出的异常并进行处理(例如:权限访问限制)。

FilterSecurityInterceptor 过滤器:该过滤器是过滤器链的最后一个过滤器,根据资源权限配置来判断当前请求是否有权限访问对应的资源。如果访问受限会抛出相关异常,并由 ExceptionTranslationFilter 过滤器进行捕获和处理。

1.3SpringSecurity的重要概念

知道了Spring Security的大致工作流程之后,我们还需要知道一些非常重要的概念也可以说是组件:

  • SecurityContext:上下文对象,Authentication对象会放在里面。
  • SecurityContextHolder:用于拿到上下文对象的静态工具类。
  • Authentication:认证接口,定义了认证对象的数据形式。
  • AuthenticationManager:用于校验Authentication,返回一个认证完成后的Authentication对象。

认证逻辑分析与设计

1.1定义security配置类,例如

/**
 * 定义SpringSecurity密码加密对象
 * @Bean 注解通常会在@Configuration注解描述的类中描述方法,
 * 用于告诉spring框架这个方法的返回值会交给spring管理,并spring
 * 管理的这个对象起个默认的名字,这个名字与方法名相同,当然也可以通过
 * @Bean注解起名字
 */

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

1.2定义security配置类,例如

@Service
public class UserDetailServiceImpl implements UserDetailsService {


    @Autowired
   
private PasswordEncoder passwordEncoder;


    @Override
   
public UserDetails loadUserByUsername(String username)

throws UsernameNotFoundException {
       
if(!"jack".equals(username))
           
throw new UsernameNotFoundException("user not found");
       
//假设这个密码是从数据库查询出来的加密密码
        String password=passwordEncoder.encode("123456");
       
//假设如下对象信息是从数据库查询出来的,第三个参数为用户的权限
        return new User(username,password,

AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_admin,ROLE_normal,/doRetrieve,/doCreate"));


    }
}

  1. 3自定义登陆页面

第一步:定义登陆页面(直接在static目录下创建即可),关键代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 <h2>Please login</h2>
<form action="/login" method="post">
    <ul>
        <li>username:</li>
        <li><input type="text" name="username">  </li>
        <li>password:</li>
        <li><input type="password" name="password">  </li>
        <li><input type="submit" value="Sign in">   </li>
    </ul>
</form>
<img src="\images\cartoongirl.png">
</body>
</html>

1.4修改安全配置类,让其实现接口,并重写相关config方法,进行登陆设计,代码如下:

@Configuration
public class SecutiryConfig extends WebSecurityConfigurerAdapter {
   
@Bean
   
public PasswordEncoder passwordEncoder(){
       
return new BCryptPasswordEncoder();
    }

   
@Override
   
protected void configure(HttpSecurity http) throws Exception {
       
//super.configure(http);
        //
关闭跨域攻击,不关闭容易出错
        http.csrf().disable();
       
//自定义登陆表单
        http.formLogin()
               
//设置登陆页面
                .loginPage("/login.html")
               
//设置登陆请求处理地址(对应form表单中的action),

//登陆时会访问UserDetailService对象
                .loginProcessingUrl("/login")
               
//设置请求用户名参数为username(默认就是username

//可以自己修改,需要与表单同步)

 http.authorizeRequests()
               
//设置要放行的咨询
                .antMatchers("/login.html").permitAll()
               
//设置需要认证的请求(除了上面的要放行,其它都要进行认证)
                .anyRequest().authenticated();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值