导引:
什么是企业架构?什么是企业架构框架?
我的理解:企业架构实际上是人与物的联系。
企业架构框架实际是企业应用系统提供的解决方案。
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"));
}
}
- 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();
}
}