security java的配置_跟我学Spring Security配置(使用Java配置和注解)

Spring Security 借助一系列Servlet Filter 来提供安全性功能,但是借助Spring的小技巧,我们只需要配置一个Filer就可以了,DelegatingFilterProxy是一个特殊的Servlet Filter,它本身所做的工作并不多,只是将工作委托给一个Javax.servlet.Filter 的实现类,这个实现类作为一个bean注册再Spring应用的上下文中。

如果了解过用xml配置spring security的朋友就知道,用基于xml配置Spring Security过程繁琐,而且不容易学习和入门,但是基于javaConfig和注解则大大简化了这一配置,下面我们来看看是如何用java的方式配置Spring Security

首先我们需要配置DelegatingFilterProxy,我们只需要拓展一个新类,该类实现了WebApplicationInitializer,因此Spring会发现它并用他在Web容器中注册DelegatingFilterProxy。

public class SecurityWebInitializer extendsAbstractSecurityWebApplicationInitializer {

}

接下来我们需要启用Web安全性功能,也是只需要拓展一个类,Spring Security 必须配置在一个实现了WebSecurityConfigurer 的bean中,或者拓展WebSecurityConfigurerAdapter 。在Spring 应用上下文中,任何实现了WebSecurityConfigurerAdapter 的bean都可以用来配置Spring Security。常用的配置已贴上,也全都写上了对应的注释。

@Configuration

@EnableWebSecuritypublic class SecurityConfig extendsWebSecurityConfigurerAdapter {

@AutowiredprivateUserDetailServiceImpl userDetailService;//对每个请求进行细粒度安全性控制的关键在于重载一下方法

@Overrideprotected void configure(HttpSecurity http) throwsException {

http

.authorizeRequests()//该方法所返回的对象的方法来配置请求级别的安全细节

.antMatchers("/login")

.permitAll()//对于登录路径不进行拦截

.antMatchers("/show").authenticated()//authenticated()表示允许过的用户访问

.and()

.formLogin()//配置登录页面

.loginPage("/login")//登录页面的访问路径

.loginProcessingUrl("/check")//登录页面下表单提交的路径

.failureUrl("/login")//登录失败后跳转的路径

.defaultSuccessUrl("/show")//登录成功后默认跳转的路径

.and()

.csrf()//启用防跨站伪请求攻击,默认启用

.and()

.logout()//用户退出操作

.logoutUrl("/logout")//用户退出所访问的路径,需要使用Post方式

.permitAll()

.logoutSuccessUrl("/login?logout=true")

.and()

.authorizeRequests()// //定义路径保护的配置方法//.antMatchers(HttpMethod.GET,"/admin")//.authenticated()

.antMatchers(HttpMethod.GET,"/message/**","/object/**").hasRole("USER")

.anyRequest().permitAll()

.and()

.rememberMe()//启用记住我功能

.tokenValiditySeconds(2419200)

;

}//配置Spring Security的Filter链

@Overridepublic void configure(WebSecurity web) throwsException {super.configure(web);

}//配置user-detail服务

@Overrideprotected void configure(AuthenticationManagerBuilder auth) throwsException {

auth.userDetailsService(userDetailService)

.passwordEncoder(new StandardPasswordEncoder("53cr3t"))//密码加密方式

;//auth.inMemoryAuthentication()//内置用户//.withUser("user").password("user").roles("USER");

}

}

需要注意的有几点,如果是用xml配置的springmvc环境下,基于javaConfig和注解配置Spring Security同样适用,只需要确保Spring的上下文能够扫描到上述的两个类即可。

如果在JSP页面下使用Spring的表单标签,该标签默认会自动添加隐藏的CSRF token标签,即防跨站伪请求攻击,如果没有使用Spring的表单标签,则需要手动添加以下标签,尤其是进行logout登出时表单提交,在Form标签内必须保护以下内容。

下面是登录页面

login

用户名:password:

Remember me

登出页面

User Manager

注销

如果我们想要配置自定义认证和授权服务,则需要实现UserDetailsService

public class UserDetailServiceImpl implementsUserDetailsService {private static Logger logger=Logger.getLogger(UserDetailServiceImpl.class);

@AutowiredprivateIUserService userService;

@AutowiredprivateIRoleService roleService;

@Overridepublic UserDetails loadUserByUsername(String username) throwsUsernameNotFoundException {

logger.info("===========授权============");

User user= null;

List role=null;try{

user= userService.findUserByUsername(username);

role=roleService.listRoleByUserId(user.getId());

logger.info("用户角色为:"+role);

}catch(BaseException e) {

e.printStackTrace();

}

List list= new ArrayList();

list.add(new SimpleGrantedAuthority("ROLE_"+role));

org.springframework.security.core.userdetails.User authUser= neworg.springframework.security.core.userdetails.User

(user.getUsername(),user.getPassword(),list);returnauthUser;

}

}

该配置将安全级别细分到角色。重写的方法传来的参数为登录的username,再通过该参数从数据库中获取用户,以及相对应的权限,最终通过 将用户、密码、权限传入并实例化org.springframework.security.core.userdetails.User ,从而授权结束。配置安全路径或者方法中的权限依据上述方法中获取并绑定的权限。至此我们就可以对路径进行安全权限保护了。

Spring Security异常之You must provide a configuration attribute  http://www.linuxidc.com/Linux/2015-02/113364.htm

Spring Security 的详细介绍:请点这里

Spring Security 的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值