本文同步发布在是与非博客(www.zhuoerhuobi.cn)
随着是与非博客基础功能的完善,给我的网站加上用户认证授权系统这件事终于是提上日程了。
用户系统我们可以拆解为登录认证和授权访问这两个功能。我们先登陆账号,用户的状态就存在在网站了,然后网站再根据该用户的角色权限授权该用户访问某些页面和接口。
如果我们自己动手实现用户系统,可以料想到大致流程为:
读取用户输入的账户密码 --> 加密后和数据库中的用户表进行比对 --> 若比对成功,则读取数据库中用户的信息,登陆成功 --> 在我们已有的接口或页面上添加判断条件或拦截器,根据用户信息中的角色或者权限等字段判断是否让用户通行。
这么做的缺点也很明显,工作量大,并且认证系统和我们的业务代码高度耦合,不利于后期维护。
在这种情况下,用户系统相关框架应运而生,当下最流行的shrio和springsecurity都能很好的完成我们上面的需求,并且它们遵循了aop原则,并不需要更改我们的业务代码就可以加入用户系统功能,相当方便。
要引入springsecurity功能,我们首先要在pom文件中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
这样,项目就引入了security模块。security默认拦截所有请求,而默认登录用户名为user,默认密码在服务启动时会打印在终端下。
security相关配置继承自WebSecurityConfigurerAdapter类,所以我们定义自己的MySecurityConfig类继承WebSecurityConfigurerAdapter,并重写其中几个方法。
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
MyUserDetailService myUserDetailService;
@Override
public void configure(WebSecurity web) throws Exception {
//不拦截静态资源
web.ignoring().antMatchers("/css/**","/js/**","/fonts/**","/lib/**","/img/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();/*关闭防御csrf攻击功能*/
//链式编程,可以连写若干个功能,为了方便理解,我们还是拆开来写。
http.formLogin() /*开启表单登录*/
.loginPage("/login")/*自定义我们自己的登陆页面*/
.defaultSuccessUrl("/index?page=1").permitAll()/*自定义登录成功页面*/
.and().authorizeRequests()
.antMatchers("/login","/resources/**").permitAll()/*选择哪些页面不需要权限*/
.antMatchers("/admin/**").hasRole(