2016-05-18 2 views
0

私は、PortalUserCompanyによってのみアクセス可能なTicketにアクセスして作成できるWebアプリケーションを作成するためにSpringを利用しています。すべてのCRUD操作を安全にするためにSpring Secuityを使用するにはどうすればよいですか?

既定では、読み取り/書き込みアクセス権を持つすべての認証ユーザーは、すべてのCRUD操作を実行できます。問題は、認証されたユーザーが、アクセス権を持たないIDを選択して、Companyの外部で操作を実行できることです。 バーからのチケットは、example.com/tickets/{any番号}

@Controller 
@RequestMapping("/tickets")  
public class TicketController { 
    @RequestMapping(value = "/{id}", produces = "text/html") 
    public String TicketController.show(@PathVariable("id") Long id, Model uiModel) { 
      ... 
    } 
    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE, produces = "text/html") 
    public String TicketController.delete(@PathVariable("id") Long id, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, Model uiModel){ 
    ... 
    } 
    @RequestMapping(method = RequestMethod.GET, produces = "text/html") 
    public String TicketController.listDatatables(Model uiModel, HttpServletRequest request) { 
    ... 
    } 
} 

でチケットへのアクセスを直接購入するなど、当社フーは非常に簡単に削除できます

、ビュー、すべてのコントローラで各メソッドを変更することなく、ユーザーが意図した範囲外のデータにアクセスできないようにする方法がありますか?

custom Filterが役に立つと思われます。私はGETの上で、パラメータマップを複製して変更することで企業を除外することができますが、すべての方法で解決策が見つかるわけではありません。

+0

? – eruiz

+0

@eruiz私は2.0.0.M1を使用しています – Jaym

答えて

0

ユーザーがチケットを作成または変更できないようにするには、Ticketにバリデーターを追加する方法が考えられます。

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord(sequenceName = "TICKET_SEQ", finders = { "findTicketsByCompany", "findTicketsByPerson" }) 
public class Ticket { 
    @ValidCompany 
    Company; 
    //.... 
} 

私たちは、現在のユーザーの資格情報をつかむためにロジックを追加し、彼らは/修正を作成しているTicketの同じCompanyにあることを確認することができます。

public class CompanyValidator implements ConstraintValidator<ValidCompany, Company> { 

@Override 
public void initialize(ValidCompany validCompany) { 
} 

public CompanyValidator() { 
} 

@Override 
public boolean isValid(Company company, ConstraintValidatorContext constraintValidatorContext) { 
    //logic 
    Company portalUserCompany = null; 
    try { 
     PortalUser portalUser = (PortalUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     portalUserCompany = portalUser.getCompany(); 
     //In this case we are getting the PortalUser's Company, but you could get a user's authorities instead. 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 
    return portalUserCompany != null && portalUserCompany.getId().equals(company.getId()); 

} 

およびインターフェース:Rooのバージョンを使用している

@Documented 
@Constraint(validatedBy = CompanyValidator.class) 
@Target({ElementType.METHOD, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ValidCompany { 
    String message() default "{validator.company}";//Error message to be displayed if the CompanyValidator isValid returns false 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 
} 
関連する問題