暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Security使用

产教Code 2019-09-17
216


Spring Security使用


Spring中首先我们先创建`WebSecurityConfig` 继承`WebSecurityConfigurerAdapter`


/**
* <p>该类下有重载了三个configure()的方法</p>
* <p>我们使用其中任意一个就可以完成所有功能的配置</p>
* <p>但是在有些时候我们为了方便管理可以分别重写这三个方法</p>
*/
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {




@Qualifier("userService")
@Autowired
private UserDetailsService userDetailsService;
//我们可以通过向我们的http.authorizeRequests()方法添加多个子节点来指定我们的URL的自定义要求
//这个方法是我们比较常用的,方法比较易懂且可方便的书写
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/setcolor").permitAll()// 指定所有用户进行访问指定的url
.anyRequest().authenticated()//方法中的自定义匹配
.and() //login设置 自定义登录页面且允许所有用户登录
.formLogin()
.permitAll()// 允许所有用户访问登录页面
.and() //and()方法就是跳出其他级的配置回到http这里
.logout() //logouts 设置
.invalidateHttpSession(true)// httpSession是否有效时间,如果使用了 SecurityContextLogoutHandler,其将被覆盖
.deleteCookies();//指定注销成功后remove cookies
}




@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().mvcMatchers("/static/**");
}
//为多个用户配置内存身份验证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance()).withUser("admin").password("123").roles("ADMIN");
auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance()).withUser("user").password("123").roles("USER");
auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance()).withUser("player").password("123").roles("PLAYER");




}
}
}




接下来我们需要创建 `WebSecurityIntializer` 类 继承 `AbstractSecurityWebApplicationInitializer` 类


import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
public class WebSecurityIntializer extends AbstractSecurityWebApplicationInitializer {
}




将应用程序中的每个URL注册`springSecurityFilterChain`过滤器。 之后,我们将确保WebSecurityConfig加载在我们现有的`ApplicationInitializer`中。它将被添加到`getRootConfigClasses()`


public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {




@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { WebSecurityConfig.class};




}
// ... other overrides ...
}




配置用户权限管理



@Service
public class UserService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
//在正常项目中,我们这里是要从数据库获得这个User
User user = new User();
//通过这个build()我们还可以很多属性赋值,以适应项目中需求
//我下面的是三个必须要给出的
return org.springframework.security.core.userdetails.User.builder()
.username(user.getName())
.password(user.getPassword())
.roles("USER")
.build();
}
}



在我们自己写的Service里面重写 `UserDetailsService`

实现其中的`loadUserByUsername()`方法,也就是根据名字获取用户的方法


这个类也就是刚才在那个配置类里注入的



@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//这里也就是把那个Service交给Security了,后面的权限判断也就不需要我们管很多了
auth.userDetailsService(userDetailsService);
}




使用`WebSecurityConfigurerAdapter`时,会自动应用注销功能。 默认情况下,访问URL` /logout`

文章转载自产教Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论