Spring-Security是Spring家族的重要一员。

Spring-Security简单使用

1.简介

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于spring的应用程序的实际标准。

Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring安全性的真正强大之处在于它很容易扩展以满足定制需求

2. 快速入门

  1. 导入SpringSecurity依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!--其他所需依赖-->
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring.security.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring.security.version}</version>
    </dependency>
  2. 在web配置文件中添加过滤器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	<!--.........-->
    <!--添加spring-security配置文件的解析-->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-security.xml</param-value>
    </context-param>
    <!--.........-->
    <!--添加spring-security所需的过滤器-->
    <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>
    <!--.........-->
    </web-app>
  3. 配置spring-security

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:security="http://www.springframework.org/schema/security"
    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">

    <!-- 配置不过滤的资源(静态资源及登录相关) -->
    <security:http security="none" pattern="/login.html" />
    <security:http security="none" pattern="/failer.html" />
    <security:http auto-config="true" use-expressions="false" >
    <!-- 对所有的路径进行权限控制,只允许ROLE_USER可以访问 -->
    <security:intercept-url pattern="/**" access="ROLE_USER" />
    <security:logout invalidate-session="true" logout-url="/logout"
    logout-success-url="/login.jsp" />
    <!-- 关闭CSRF,默认是开启的 -->
    <security:csrf disabled="true" />
    </security:http>
    <!--静态配置认证的用户及密码-->
    <security:authentication-manager>
    <security:authentication-provider>
    <security:user-service>
    <security:user name="user" password="{noop}user"
    authorities="ROLE_USER" />
    <security:user name="admin" password="{noop}admin"
    authorities="ROLE_ADMIN" />
    </security:user-service>
    </security:authentication-provider>
    </security:authentication-manager>
    </beans>
  4. 运行Maven工程

    运行工程时,首先会弹出一个要求输入用户名和密码的页面,这是spring-security为我们提供的默认的登录页面,当我们没有指定登录页面时会使用该页面。

    输入用户名:admin,密码:admin时,会提示403,表示权限不足,这是因为上面配置的access角色需要是ROLE_USER

    输入用户名:user,密码:user时,可以正常登录。

    输入错误的用户名或者密码时,会提示账号或者密码错误信息。

3. 实战【ssm权限管理系统】

  1. 导入依赖

  2. web配置文件中配置过滤器、spring-security的配置文件解析

  3. 配置spring-security

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:security="http://www.springframework.org/schema/security"
    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">
    <!--配置不拦截的资源-->
    <security:http pattern="/login.jsp" security="none"/>
    <security:http pattern="/failer.jsp" security="none"/>
    <security:http pattern="/css/**" security="none"/>
    <security:http pattern="/img/**" security="none"/>
    <security:http pattern="/plugins/**" security="none"/>

    <!--配置具体-->
    <!--配值是否使用默认登录页面、不使用sepl表达式-->
    <security:http auto-config="true" use-expressions="false">
    <!--配置拦截地址、可访问的角色-->
    <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>

    <!--定义跳转页面-->
    <!--
    login-page="/login.jsp" 指定默认的登录页面
    login-processing-url="/login" 指定登录页面登录的处理方法
    default-target-url="index.jsp"
    authentication-failure-url="/failer.jsp" 指定失败跳转页面
    authentication-success-forward-url="/pages/main.jsp" 指定成功跳转页面
    -->
    <security:form-login
    login-page="/login.jsp"
    login-processing-url="/login"
    default-target-url="/index.jsp"
    authentication-failure-url="/failer.jsp"
    authentication-success-forward-url="/pages/main.jsp"
    />

    <!--关闭跨越请求-->
    <security:csrf disabled="true"/>
    <!-- 指定退出 -->
    <security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp"/>
    </security:http>

    <!--数据库方式验证-->
    <security:authentication-manager>
    <security:authentication-provider user-service-ref="userLoginServiceImpl">
    <!--配置加密方式-->
    </security:authentication-provider>
    </security:authentication-manager>


    </beans>

    配置不过滤的元素

    配置可以访问的角色

    配置登录页面、处理登录请求的方法,处理登录成功、登录失败跳转的页面等

    配置处理请求的服务

  4. 将登陆请求的url指向前面定义的 login-processing-url参数

    1
    2
    3
    <form action="/login" method="post">
    <!--省略....-->
    </form>
  5. 创建处理登录请求的接口

    创建UserLoginService继承继承自UserDtailsService接口

    1
    2
    public interface UserLoginService extends UserDetailsService {
    }

    创建UserLoginService的实体类并重写方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    @Service("userLoginServiceImpl")
    @Transactional
    public class UserLoginServiceImpl implements UserLoginService {

    @Autowired
    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    System.out.println(username);
    UserInfo userInfo = userDao.findUserByUsername(username);
    System.out.println(userInfo);
    List<Role> roles = userInfo.getRoles();
    System.out.println(userInfo);
    List<SimpleGrantedAuthority> authorities = getAuthority(roles);
    User user = new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),true,true,true,true,authorities);
    return user;
    }
    private List<SimpleGrantedAuthority> getAuthority(List<Role> roles){
    List<SimpleGrantedAuthority> authorities = new ArrayList<>();
    for (Role role : roles) {
    authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
    }
    return authorities;
    }
    }
  6. 实战总结

    【依赖以及web配置文件的配置】较为固定没有什么难度,不过给过滤器定义名称时要注意。

    【Spring-security配置文件配置】根据需求定义访问的角色、结束登录请求的地址,登录的挑战等。

    【接口的继承以及实现】记住要实现的接口,以及实现类实现方法的含义。

评论