Spring Security授权异常:非管理员所有者无法查看下拉菜单
问题解决方法
核心原因
虽然你在Thymeleaf中直接调用owner.equals(#authentication.principal)返回true,但Spring Security的表达式上下文在执行#authentication.principal.equals(#owner)时,可能因变量上下文解析差异、对象实例比较的隐式问题导致判断失效。
具体解决方案
1. 优先通过ID匹配(最可靠)
避免直接比较对象实例,改用用户唯一ID进行匹配,能绕过对象实例化差异的问题:
<span sec:authorize="hasRole('ADMIN') or #authentication.principal.id == #owner.id"> <form class="form-horizontal" th:action="@{/todos/{id}/add(id = ${todo.id})}" method="get"> <select class="form-control" name="user_id" id="users"> <option>Select collaborator...</option> <option th:each="user : ${users}" th:value="${user.id}" th:text="${user.firstName + ' ' + user.lastName}"></option> </select> <input align="right" class="btn btn" type="submit" value="Add"> </form> </span>
2. 修正模板变量在Security表达式中的引用方式
如果坚持使用对象equals比较,尝试用@owner语法引用模板中的owner变量(适配部分Thymeleaf Spring Security版本的上下文规则):
<span sec:authorize="hasRole('ADMIN') or #authentication.principal.equals(@owner)"> <!-- 表单内容不变 --> </span>
3. 检查User类的equals方法
确认你的用户实体类(或UserDetails实现类)正确重写了equals方法,基于唯一标识(如ID)进行比较,避免因不同实例导致的比较逻辑失效。
内容的提问来源于stack exchange,提问作者no way
相关产品推荐
相关产品推荐

