zoukankan      html  css  js  c++  java
  • Spring Secutrity入门教程

    一.简介

    Spring Security是 Spring提供的安全认证服务的框架(当然还有shiro框架也能实现)。 使用Spring Security可以帮助我们来简化认证 和授权的过程。

    官网:https://spring.io/projects/spring-security

    二.使用前需要准备的步骤

    1.导入jar包,这里介绍的是maven仓库依赖jar

     2.配置web.xml文件

    <web-app>
    <display-name>Archetype Created Web Application</display-name>
    <filter>
    <!--
    DelegatingFilterProxy用于整合第三方框架
    整合Spring Security时过滤器的名称必须为springSecurityFilterChain,
    否则会抛出NoSuchBeanDefinitionException异常
    -->
    <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>
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-security.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    </web-app>
    3.配置spring-security.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd">

    <!--配置哪些资源匿名可以访问(不登录也可以访问)-->
    <!--<security:http security="none" pattern="/pages/a.html"></security:http>
    <security:http security="none" pattern="/pages/b.html"></security:http>-->
    <!--<security:http security="none" pattern="/pages/**"></security:http>-->
    <security:http security="none" pattern="/login.html"></security:http>
    <!--
    auto-config:自动配置,如果设置为true,表示自动应用一些默认配置,比如框架会提供一个默认的登录页面
    use-expressions:是否使用spring security提供的表达式来描述权限
    -->
    <security:http auto-config="true" use-expressions="true">
    <!--配置拦截规则,/** 表示拦截所有请求-->
    <!--
    pattern:描述拦截规则
    asscess:指定所需的访问角色或者访问权限
    -->
    <!--只要认证通过就可以访问-->
    <security:intercept-url pattern="/pages/a.html" access="isAuthenticated()" />

    <!--拥有add权限就可以访问b.html页面-->
    <security:intercept-url pattern="/pages/b.html" access="hasAuthority('add')" />

    <!--拥有ROLE_ADMIN角色就可以访问c.html页面-->
    <security:intercept-url pattern="/pages/c.html" access="hasRole('ROLE_ADMIN')" />

    <!--拥有ROLE_ADMIN角色就可以访问d.html页面,
    注意:此处虽然写的是ADMIN角色,框架会自动加上前缀ROLE_-->
    <security:intercept-url pattern="/pages/d.html" access="hasRole('ADMIN')" />
    <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-url>

    <!--如果我们要使用自己指定的页面作为登录页面,必须配置登录表单.页面提交的登录表单请求是由框架负责处理-->
    <!--
    login-page:指定登录页面访问URL
    -->
    <security:form-login
    login-page="/login.html"
    username-parameter="username"
    password-parameter="password"
    login-processing-url="/login.do"
    default-target-url="/index.html"
    authentication-failure-url="/login.html"></security:form-login>

    <!--
    csrf:对应CsrfFilter过滤器
    disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁用(403)
    -->
    <security:csrf disabled="true"></security:csrf>

    <!--
    logout:退出登录
    logout-url:退出登录操作对应的请求路径
    logout-success-url:退出登录后的跳转页面
    -->
    <security:logout logout-url="/logout.do"
    logout-success-url="/login.html" invalidate-session="true"/>

    </security:http>

    <!--配置认证管理器-->
    <security:authentication-manager>
    <!--配置认证提供者-->
    <security:authentication-provider user-service-ref="userService2">
    <!--
    配置一个具体的用户,后期需要从数据库查询用户
    <security:user-service>
    <security:user name="admin" password=" 1234" authorities="ROLE_ADMIN"/>
    </security:user-service>
    -->
    <!--指定度密码进行加密的对象-->
    <security:password-encoder ref="passwordEncoder"></security:password-encoder>
    </security:authentication-provider>
    </security:authentication-manager>

    <bean id="userService" class="com.hy.service.SpringSecurityUserService"></bean>
    <bean id="userService2" class="com.hy.service.SpringSecurityUserService2"></bean>
    <!--配置密码加密对象-->
    <bean id="passwordEncoder"
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

    <!--开启spring注解使用-->
    <context:annotation-config></context:annotation-config>

    <!--开启springmvc注解的支持-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <context:component-scan base-package="com.hy.controller"></context:component-scan>

    <!--开启注解方式权限控制-->
    <security:global-method-security pre-post-annotations="enabled" />
    <!--使用前端控制器/时需要配置以下 https://www.cnblogs.com/dreampig/p/9001772.html-->
    <!--<mvc:default-servlet-handler/>-->
    <!--<mvc:view-controller path="/" view-name="redirect:/login.html"/>-->
    <!--静态资源映射-->
    <!--<mvc:resources mapping="" location="" cache-period="31536000"/>-->

    </beans>
    到了这里,根据以上的注解,基本就能理解spring-secutriy配置文件的基本配置
    权限和角色的校验拦截有配置方式也有注解方式(这里介绍一种注解@PreAuthorize("hasAuthority('add')"),其余的可百度)
    如果我们要从数据库动态查询用户信息,就必须按照spring security框架的要求提供一个实现 UserDetailsService接口的实现类,并按照框架的要求进行配置即可。
    框架会自动调用实现类中的方法 并自动进行密码校验。
    public class SpringSecurityUserService implements UserDetailsService {
    //模拟数据库中的用户数据
    public static Map<String, User> map = new HashMap<>();
    static {
    com.hy.pojo.User user1 = new com.hy.pojo.User();
    user1.setUsername("admin");
    user1.setPassword("admin");//明文密码(没有加密)

    com.hy.pojo.User user2 = new com.hy.pojo.User();
    user2.setUsername("xiaoming");
    user2.setPassword("1234");

    map.put(user1.getUsername(),user1);
    map.put(user2.getUsername(),user2);
    }

    //根据用户名查询用户信息
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    System.out.println("用户输入的用户名为:" + username);
    //根据用户名查询数据库获得用户信息(包含数据库中存储的密码信息)
    User user = map.get(username);//模拟查询根据用户名查询数据库
    if(user == null){
    //用户名不存在
    return null;
    }else{
    //将用户信息返回给框架
    //框架会进行密码比对(页面提交的密码和数据库中查询的密码进行比对)
    List<GrantedAuthority> list = new ArrayList<>();
    //为当前登录用户授权,后期需要改为从数据库查询当前用户对应的权限
    list.add(new SimpleGrantedAuthority("permission_A"));//授权
    list.add(new SimpleGrantedAuthority("permission_B"));

    if(username.equals("admin")){
    list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));//授予角色
    }
    org.springframework.security.core.userdetails.User securityUser = new org.springframework.security.core.userdetails.User(username,"{noop}"+user.getPassword(),list);
    return securityUser;
    }
    }




  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/HYV587/p/12654523.html
Copyright © 2011-2022 走看看