Spring Security:許可權控制
阿新 • • 發佈:2020-10-04
授權
之前在認證的時候,就對使用者做了授權
@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表示式註解