1. 程式人生 > 實用技巧 >Spring Security:許可權控制

Spring Security:許可權控制

授權

之前在認證的時候,就對使用者做了授權

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        try{
            SysUser sysUser = userDao.findByName(username);
            if(Objects.isNull(sysUser))
                return null;
            List<SimpleGrantedAuthority> authorities = new ArrayList<>();
            for(SysRole role : sysUser.getRoles()){
                authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
            }
            log.info("{}",authorities);
            //{noop}後面的密碼,SpringSecurity會認為是原文
            return new User(username,sysUser.getPassword(),sysUser.getStatus()==1,true,true,true,authorities);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

對選單進行許可權控制:

<security:authorize access="hasAnyRole('ROLE_PRODUCT','ROLE_ADMIN')">
    <li id="system-setting"><a
                               href="${pageContext.request.contextPath}/product/findAll">
        <i class="fa fa-circle-o"></i> 產品管理
        </a></li>
</security:authorize>
<security:authorize access="hasAnyRole('ROLE_ORDER','ROLE_ADMIN')">
    <li id="system-setting"><a
                               href="${pageContext.request.contextPath}/order/findAll">
        <i class="fa fa-circle-o"></i> 訂單管理
        </a></li>
</security:authorize>

表示產品管理只有ROLE_PRODUCT和ROLE_ADMIN角色的能夠看到

訂單管理只有ROLE_ORDER和ROLE_ADMIN角色的能夠看到

動態許可權註解支援

SpringSecurity可以通過註解方式來控制或者類的訪問許可權。註解需要對應的支援,若註解放在controller中,對應註解支援應該放在mvc配置檔案中,因為controller類是由mvc配置檔案掃描並建立的,同理,註解放在service類中,對應註解應該放在spring配置檔案中。

開啟springsecurity註解:(寫在springmvc配置檔案中)

    <!--開啟許可權控制的註解支援
        secured-annotations:spring security的許可權控制註解開關
        pre-post-annotations:spring的許可權控制註解開關
        jsr250-annotations:jsr250註解開關
    -->
    <security:global-method-security
            secured-annotations="enabled"
            pre-post-annotations="enabled"
            jsr250-annotations="enabled"/>

添加註解:

@Controller
@RequestMapping("/product")
public class ProductController {

    @Secured({"ROLE_ADMIN","ROLE_PRODUCT"})
    @RequestMapping("/findAll")
    public String findAll(){
        return "product-list";
    }
}

三種註解

  • @Secured({"ROLE_ADMIN","ROLE_PRODUCT"}): Spring security註解
  • @RolesAllowed({"ROLE_ADMIN","ROLE_PRODUCT"}): jsr250註解
  • @PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_PRODUCT')"):spring的el表示式註解