Spring_Security初学1


前言

关于学习spring-security过程中的记录


一、Spring-Security是什么?

spring_security是一款权限框架,能方便快捷实现认证和授权控制,能与spring系列框架无缝整合。

1.认证: 让程序知道你是谁,未认证则认定为匿名用户。
2.授权: 访问某些指定资源时需要的权限,比如对数据修改可指定为需要修改权限,可以设置某个角色拥有某个权限,角色和权限可以是多对多的关系

二、入门案例编写

1.导入依赖

pom.xml:
两个关键的依赖

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
  <version>5.0.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-config</artifactId>
  <version>5.0.5.RELEASE</version>
</dependency>

2.spring-security.xml配置文件编写

编写步骤:

  1. 定义相关权限 security:http
    1.1 开始部分设置默认 auto-config
    1.2 开始表达式使用 use-expressions
    1.3 为特定资源设置权限 security:intercept-url
    1.4 屏蔽登录界面检测 security:csrf
    1.5 自定义登入界面 security:form-login
    1.6 配置登出 security:logout
<!--
    http:用于定义相关权限控制
    auto-config:是否自动配置
        * 设置为true时框架会提供默认的一些配置,例如提供默认的登录页面、登出处理等
        * 设置为false时需要显示提供登录表单配置,否则会报错
    use-expressions:用于指定intercept-url中的access属性是否使用表达式
    -->
    <security:http auto-config="true" use-expressions="true">
        <!--对哪些资源进行校验,相应资源需要的具体角色-->
        <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>

        <!--
        login-page:自定义的登录页面url地址
        username-parameter:自定义页面中代表账号的name属性
        password-parameter:自定义页面中代表密码的name属性
        login-processing-url:登入提交的路径
        default-target-url:认证成功后跳转的界面
        authentication-failure-url:认证失败后跳转的界面
        -->
        <security:form-login
                login-page="/login.html"
                username-parameter="username"
                password-parameter="password"
                login-processing-url="/user/login"
                default-target-url="/index.html"
                authentication-failure-url="/login.html"
        />

        <!--
        logout-url:登出时访问的路径
        logout-success-url:登出成功后跳转的页面
        invalidate-session="true" :使session无效
        -->
        <security:logout
                logout-url="/login/out"
                logout-success-url="/login.html"
                invalidate-session="true"/>

        <!--屏蔽对登录页面的检测,使自定义的登录页面可以使用-->
        <security:csrf disabled="true"/>
    </security:http>
  1. 配置可匿名访问的资源

    <!--配置可匿名访问的资源-->
    <security:http security="none" pattern="/login.html"/>
    <security:http security="none" pattern="/css/**"></security:http>
    <security:http security="none" pattern="/js/**"></security:http>
    <security:http security="none" pattern="/favicon.ico"></security:http>
  1. 配置认证管理器 security:authentication-manager
    3.1认证提供者
    3.2加密器
<!--提供用来对比认证的实例,由返回值确定-->
    <bean id="userService" class="com.xxx.service.SpringSecurityUserService"/>

    <!--加密器实例,将提交的密码加密后后再对比-->
    <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

    <!--配置认证管理器-->
    <security:authentication-manager>
        <!--user-service-ref:指定认证服务提供者-->
        <security:authentication-provider user-service-ref="userService">
            <!--ref:指定加密器-->
            <security:password-encoder ref="passwordEncoder"/>
        </security:authentication-provider>
    </security:authentication-manager>
  1. 注解驱动以及静态资源释放
<!--释放静态资源-->
    <mvc:default-servlet-handler/>
    <!--开启spring注解驱动-->
    <context:annotation-config></context:annotation-config>

三.关于认证提供者的编写

// 如果要成为认证提供者必须实现UserDetailsService接口
public class SpringSecurityUserService implements UserDetailsService {
    
    // 本地注入配置文件中配置的加密器对象
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
    
    // 认证信息由该方法的返回值决定
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 手动写死密码并加密
        String password = passwordEncoder.encode("admin");
        
        // 从源码中可以看出这里需要GrantedAuthority的实现类 
        // 为user添加一个角色
        List<GrantedAuthority> list = new ArrayList<>();
        list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
        
        // 返回认证信息
        User user = new User("admin", password, list);

        return user;
    }
}

总结

希望下个月我还能看得懂我写了什么东西吧。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页