1.使用Spring Security配置命名空间

spring securtiy 提供了安全性相关的命名空间,我们可以将spring security的命名空间声明添加到spring公用的配置xml文件中,这样在配置安全性的时候我们需要使用security作为前缀来表明配置是关于安全性的配置;同时我们也可以将安全性相关的配置提取出来拆分到一个单独的spring-secutiry.xml文件中,同时将该配置文件的首要命名空间改为安全性命名空间,这样在配置安全性的时候就无需security前缀了。spring-security.xml命名空间如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
</beans:beans>

2.配置对于web请求的保护

  Spring Security 借助一系列的Servlet过滤器来提供各种安全功能,需要在web.xml里加入一个过滤器:

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter> <filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

  DelegatingFilterProxy将工作委托给一个javax.servlet.filter实现类,这个实现类作为一个bean注册在Spring应用的上下文中。在这里我配置的过滤器将过滤所有的web请求。

  接下来就可以配置安全性了,在这里使用<http>元素进行配置,<http>会自动创建一个FilterChainProxy以及链中的所有过滤器Bean,FilterChainProxy将会委托给在web.xml中的delegatingFilterProxy。同时<http>还有一个auto-config属性,如果设为true,即采用spring security的自动配置,它将会为我们提供一个登陆页、http认证功能以及退出功能。

 <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

 <intercept-url pattern="/user/register.html" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

  在这里我首先采用 <http pattern="/resources/**" security="none"></http> 让spring security 对于所有resources下的请求都不进行安全性认证,因为resources下是系统的一些图片、css、js资源。

  其次对于登陆页面和注册页面的请求,也不进行安全性认证(IS_AUTHENTICATED_ANONYMOUSLY:即匿名身份验证):

   

  然后对登录页面进行设置:

   

 <form-login login-processing-url="/user/login.html" login-page="/login.jsp" default-target-url="/user/index.html"
          authentication-failure-url="/login.jsp" />

      login-processing-url:登录请求

      login-page:登录页面

      default-target-url:登录成功以后默认跳转到的页面

      default-target-url:认证失败后跳转到的页面

  登录页面设置完毕后对退出系统进行设置:

   

 <logout logout-success-url="/login.jsp" logout-url="/user/logout.html"/>

      logout-success-url:退出成功以后跳转的页面

      logout-url:退出的请求

完整的web认证配置:

<http pattern="/resources/**" security="none"></http>

        <http>
<intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/register.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/**" access="ROLE_ADMIN"/>//所有的请求都要有ROLE_ADMIN的权限才能访问
<form-login login-processing-url="/user/login.html" login-page="/login.jsp" default-target-url="/user/index.html"
authentication-failure-url="/login.jsp" /> <logout logout-success-url="/login.jsp" logout-url="/user/logout.html"/>
</http>

3.对用户进行认证

  spring security 有多种对于用户的策略,基于内存用户存储库,基于jdbc的用户存储库,基于LDAP的用户存储库等等,在这里我选用的是基于jdbc即基于数据库的认证。

  首先实现UserDetailsService接口,实现类叫myUserDetailsService,并在spring-security中声明这个bean

 <logout logout-success-url="/login.jsp" logout-url="/user/logout.html"/>

myUserDetailsService:

@Service
public class MyUserDetailsService implements UserDetailsService{ private static Logger log = Logger.getLogger(MyUserDetailsService.class); @Autowired
private UserDao userDao;
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
User user = new User();
try{
user = userDao.getByColumn("username",username);
}catch(Exception e){
e.printStackTrace();
log.error("spring security load user fail", e.getCause());
}
return user;
} }

通过这个service从数据库获取User对象,但是要注意UserDetailsService接口中的loadUserByUsername()方法返回的是UserDetails对象,所以你的User对象必须继承自UserDetails接口,并且实现接口中的方法。

User:

public class User implements UserDetails{    
   private Integer user_id;
private String username;
private String password;
private List<Role> roles; public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
public Collection<? extends GrantedAuthority> getAuthorities() {//获取认证的权限
List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
for(Role role : roles){
GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getAuthority());
list.add(grantedAuthority);
}
return list;
} //用户是否未过期
public boolean isAccountNonExpired() {
return true;
}
//用户是否被锁定
public boolean isAccountNonLocked() {
return true;
}
//凭据是否过期
public boolean isCredentialsNonExpired() {
return true;
}
//用户是否可用
public boolean isEnabled() {
return true;
} }

权限类:

  

public class Role {
private String username;
private String authority;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAuthority() {
return authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
}

声明了myUserDetailsService以后,就可以使用myUserDetailsService作为认证的提供者了:

 <authentication-manager>
<authentication-provider user-service-ref="myUserDetailsService">
<password-encoder ref="passwordEncoder">
<salt-source user-property="username"/>
</password-encoder>
</authentication-provider>
</authentication-manager>

在这里我们必须将密码使用的加密方式进行声明,否则service不会对用户输入的密码进行加密,那么数据库和用户输入的密码就不可能对上。这儿我使用的加密的方式是md5加密,使用的盐值是用户的用户名。

加密bean的声明:

<beans:bean id="passwordEncoder"
class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />

基本的配置已经完成了,最后需要注意的一点就是在写用户登录表单的时候,用户名和密码的name注意是:j_username和j_password,否则将会取不到用户输入的用户名和密码的值。

到这里一个简单的spring security的配置就基本完成了。当然spring security的安全性功能远远还不止这些,等待继续深一步的学习。  

spring security learning(spring in action)的更多相关文章

  1. PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB

    转自:http://justinrodenbostel.com/2014/05/30/part-5-integrating-spring-security-with-spring-boot-web/ ...

  2. Spring Security +Oauth2 +Spring boot 动态定义权限

    Oauth2介绍:Oauth2是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的. 简单的来说,当用户登陆网站的时候,需要账号 ...

  3. Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器,包括Spring Security和Spring Boot

    2月14日,Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器. 其中包括Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队将不再提供 ...

  4. 漫谈Spring Security 在Spring Boot 2.x endpoints中的应用(一)

    Spring Boot 2.x极大简化了默认的安全配置,并不是说有很多安全相关的配置,现在你只需要提供一个WebSecurityConfigurerAdapter继承类这样一个简单的操作,Spring ...

  5. spring boot:用spring security加强spring boot admin的安全(spring boot admin 2.3.0 / spring boot 2.3.3)

    一,spring boot admin的安全环节: 1,修改context-path,默认时首页就是admin, 我们修改这个地址可以更安全 2,配置ip地址白名单,有ip限制才安全, 我们使用了sp ...

  6. 微服务下前后端分离的统一认证授权服务,基于Spring Security OAuth2 + Spring Cloud Gateway实现单点登录

    1.  整体架构 在这种结构中,网关就是一个资源服务器,它负责统一授权(鉴权).路由转发.保护下游微服务. 后端微服务应用完全不用考虑权限问题,也不需要引入spring security依赖,就正常的 ...

  7. spring security在spring mvc的action中获取登录人信息

    @RequestMapping("/index") public ModelAndView login( @RequestParam(value = "error&quo ...

  8. SpringMVC 3.1集成Spring Security 3.1

    这篇算是一个入门文章,昨天看见有网友提问,spring mvc集成spring security 的时候出错,揣测了一下问题木有解决.我就帮忙给搭建了一个集成框架他说可以,他告诉我这样的文章网上少.今 ...

  9. spring security源码分析之web包分析

    Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案.一般来说,Web 应用的安全性包括 ...

随机推荐

  1. 使用maven构建 ssm项目 tomcat7插件运行报错, Invalid byte tag in constant pool: 60

    错误日志: [WARNING] [WARNING] Some problems were encountered while building the effective settings[WARNI ...

  2. python 爬虫之 urllib 实践

    文章更新于:2020-03-19 注:本文参考官方文档进行 urllib 的讲解. 文章目录 一.urllib 模块介绍 1.urllib.request.py模块 (1)`urlopen`函数 (2 ...

  3. go For-range结构

    For结构: for 初始化;条件语句;修饰语句{ 输出 } 一.For-range结构是可以怎么用? 这种构建方法可以应用于数组和切片: for ix, value := range slice1 ...

  4. 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

    如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让 ...

  5. c++容器的底层数据结构

    序列式容器 vector ->底层数据结构为数组,支持快速随机访问 list ->底层数据结构为双向链表,支持快速增加和删除 deque ->底层数据结构为一个中央控制器和多个缓冲区 ...

  6. WPF 仿语音播放 自定义控件

    原理很简单,利用Path画一个图,然后用动画进行播放,播放时间由依赖属性输入赋值与控件内部维护的一个计时器进行控制. 控件基本是玩具,无法作为真实项目使用. 非专业UI,即使知道怎么画图也是画的不如意 ...

  7. AJ学IOS 之二维码学习,快速生成二维码

    AJ分享,必须精品 二维码是一项项目中可能会用到的,iOS打开相机索取二维码的速度可不是Android能比的...(Android扫描二维码要来回来回晃...) 简单不多说,如何把一段资料(网址呀,字 ...

  8. 给学妹的 Java 学习路线

    大家好,这篇文章主要是讲解下如何自学 Java,这个问题有很多粉丝私信问过,今天又有直系学妹问我如何学习 Java? 我就以我的经历,总结下分享给大家,有不当指出或者有更好的方法建议也欢迎留言指出,大 ...

  9. Geber文件,装配图,BOM表的输出

    一.Geber文件的输出步骤: 注:选择需要导出的层 注:所指箭头的地方都多加个零,让输出有更大的空间来容纳 总结:这就是最终的Geber文件了 二.NC   Drill file的输出: 三.IPC ...

  10. CSS也能计算:calc

    举个例子ul li适配屏幕,如果加个border:1px,不用border-content得情况下,每个li多加了2px: <ul><li></li><li& ...