SpringSecurity权限管理

SpringSecurity权限管理

Security能做什么?

用户认证:系统认为用户是否能够登录

用户授权:系统判断用户是否有权力去做某些事情

SpringSecurity特点:

  1. 和Spring无缝整合
  2. 全面的权限控制
  3. 专门为web开发而设计
  4. 重量级 需要引入各种依赖

SpringSecurity基本原理:

SpringSecurity本质上是一个过滤器链  包含很多个过滤器

执行流程:

  1. 配置DelegatingFilterProxy
  2. 执行doFilter
  3. initDelegate初始化
  4. String targetBeanName =this.getTargetBeanName 获取到内置过滤器FilterChainProxy
  5. doFilterInternal过滤器调用getFilters方法
  6. getFilters通过迭代器最终返回List<Filter>
  7. List<Filter>集合中加载了所有的过滤器

部分代码:

 1.web.xml

<!--委派过滤器,用于整合其他框架-->
<filter>
    <!--整合spring security时,此过滤器的名称固定springSecurityFilterChain-->
    <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>

2.SpringSecurityUserService

@Component
public class SpringSecurityUserService implements UserDetailsService {

    @Reference
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //通过用户名查找用户
        com.aaa.pojo.User user = userService.findUserByUsername(username);
        if (user == null){
            return null;
        }
        List<GrantedAuthority> list = new ArrayList<>();
        Set<Role> roles = user.getRoles();
        for (Role role : roles) {
            list.add(new SimpleGrantedAuthority(role.getKeyword()));
            Set<Permission> permissions = role.getPermissions();
            for (Permission permission : permissions) {
                list.add(new SimpleGrantedAuthority(permission.getKeyword()));
            }
        }
        UserDetails userDetails = new User(username,user.getPassword(),list);
        return userDetails;
    }
}

3.applicationContext-security.xml

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

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

</security:http>

<!--配置认证管理器-->
<security:authentication-manager>
    <!--配置认证提供者-->
    <security:authentication-provider user-service-ref="springSecurityUserService">
        <!--指定度密码进行加密的对象-->
        <security:password-encoder ref="passwordEncoder"></security:password-encoder>
    </security:authentication-provider>
</security:authentication-manager>

<!--配置密码加密对象-->
<bean id="passwordEncoder"
      class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

<!--开启注解方式权限控制-->
<security:global-method-security pre-post-annotations="enabled" />

<bean id="springSecurityUserService" class="com.aaa.service.SpringSecurityUserService"></bean>

权限管理经典数据库设计(5表、7表)

1.7表

2.5表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值