我的SpringSecurity实践
我的SpringSecurity实践
(一) 数据库与实体类设计(mysql)
虽然SpringSecurity框架提供的接口很多,真正要亲自实现的不多三个而已
org.springframework.security.core.GrantedAuthorityorg.springframework.security.core.userdetails.UserDetailsorg.springframework.security.core.userdetails.UserDetailsService
(三) 编写Spring Security 配置文件
尽管SpringSecurity提供了<http>元素来简化配置,简化过后有相当多的细节被隐藏起来了。
有时候想改变一下框架的默认行为十分不便。我还是用传统的Bean方式。
这样虽然麻烦,但是掌握之后,一旦看哪个bean不顺眼就可以方便的取而代之。强大灵活!
3.0 xml的schema, 因为是用bean的方式配置嘛,默认命名空间当然是用beans方便。
3.1 web项目部署描述
3.3 channelProcessingFilter: 常用来将某些HTTP协议的URL重定向到HTTPS协议
3.4 concurrencyFilter:HttpSession并发过滤器
3.5 securityContextPersistenceFilter:获取或存储一个SecurityContext
3.6 logoutFilter:监控一个实现退出功能的URL
这个bean没有没有默认构造方法。
3.7 usernamePasswordProcessingFilter:处理用户登录请求
3.8 rememberMeProcessingFilter: 实现"记住我"功能
被我注释掉的jdbcRememberMeTokenRepository需要一个数据库表
这个表用来持久化RememberMeToken,生产环境一般还是要这样做的。
3.10 exceptionTranslationFilter: 验证通不过?没有访问权限?这个Filter决定如果出现异常了到底应该这么办。
3.11 filterSecurityInterceptor:核心过滤器的最后一个。它完成最终的授权判断
下面的配置有点多,那是因为filterSecurityInterceptor是个懒家伙。
它把工作委托AuthenticationManager接口,AuthenticationManager接口也不真的干活,
它委托多个AuthenticationProvider接口,当然其中一个AuthenticationProvider还是要
把工作委托给我们的UserDetailsService实现的。最后投票决定到最终结果。
3.12 其他的工具bean
(四) How to
4.1 在MVC框架里,我该如何得到现在已经登录的用户?
以上的配置只是例子而已。
你可以这样的
hasRole是一个SpEL的函数名,个人也感觉它起名字有问题,这个函数实际上是根据
GrantedAuthority接口来判断。而跟我们定义的Role或者Permission没有直接关系。
以上的配置只是例子而已。
你可以这样的
hasRole是一个SpEL的函数名,个人也感觉它起名字有问题,这个函数实际上是根据
GrantedAuthority接口来判断。而跟我们定义的Role或者Permission没有直接关系。
请问<security:intercept-url pattern="/**" access="hasRole('PERMISSION_CAN_DO_SOMETHING')" />
PERMISSION_CAN_DO_SOMETHING是表达什么意思?写死在这里吗?
页面标签<sec:authorize url="/add*">不好使,看官方文档说在应用程序上下文必须有webapplicationContext实例,才能用 google上查不到 请帮忙解答,非常感谢!
以上的配置只是例子而已。
你可以这样的
hasRole是一个SpEL的函数名,个人也感觉它起名字有问题,这个函数实际上是根据
GrantedAuthority接口来判断。而跟我们定义的Role或者Permission没有直接关系。
请问<security:intercept-url pattern="/**" access="hasRole('PERMISSION_CAN_DO_SOMETHING')" />
PERMISSION_CAN_DO_SOMETHING是表达什么意思?写死在这里吗?
页面标签<sec:authorize url="/add*">不好使,看官方文档说在应用程序上下文必须有webapplicationContext实例,才能用 google上查不到 请帮忙解答,非常感谢!
你好。
"PERMISSION_CAN_DO_SOMETHING"就是"GrantedAuthority"接口的"generateGrantedAuthority()"方法的返回值,我是用Hibernate实现的UserDetailsService从数据库里把这个字符串取出来。
这个字符串就是一个用户有没有某种权限判断的依据。
<sec:authorize url="/add*">我也没有用过。
以上的配置只是例子而已。
你可以这样的
hasRole是一个SpEL的函数名,个人也感觉它起名字有问题,这个函数实际上是根据
GrantedAuthority接口来判断。而跟我们定义的Role或者Permission没有直接关系。
请问<security:intercept-url pattern="/**" access="hasRole('PERMISSION_CAN_DO_SOMETHING')" />
PERMISSION_CAN_DO_SOMETHING是表达什么意思?写死在这里吗?
页面标签<sec:authorize url="/add*">不好使,看官方文档说在应用程序上下文必须有webapplicationContext实例,才能用 google上查不到 请帮忙解答,非常感谢!
你好。
"PERMISSION_CAN_DO_SOMETHING"就是"GrantedAuthority"接口的"generateGrantedAuthority()"方法的返回值,我是用Hibernate实现的UserDetailsService从数据库里把这个字符串取出来。
这个字符串就是一个用户有没有某种权限判断的依据。
<sec:authorize url="/add*">我也没有用过。
我现在是把资源url写在DB中,配置文件中不需要
也是自定义的filter
使用ss3提供的JSP标签,<sec:authorize 来控制页面上显示的内容,请问您是怎么做到的? 7 楼 yingzhor 2012-05-10 我就是用的这个呀。
<sec:authorize access="hasRole('ROLE_ADMIN')">
这段文本只有管理员可见
</sec:authorize>
如果登录的用户有管理员的角色的话,中间的文本他就可以看见了。
8 楼 leon.s.kennedy 2012-05-10 yingzhor 写道我就是用的这个呀。
<sec:authorize access="hasRole('ROLE_ADMIN')">
这段文本只有管理员可见
</sec:authorize>
如果登录的用户有管理员的角色的话,中间的文本他就可以看见了。
那您就把ROLE_ADMIN角色写死在jsp中
ROLE_ADMIN角色删除不了
如果其他角色想访问该资源,还得改源码
小弟糊涂,还望大·侠指点!
方便的话加我qq459109544
谢谢