admin 管理员组

文章数量: 887152


2024年2月7日发(作者:mysql删除数据表)

一、 介绍:

shiro是apache提供的强大而灵活的开源安全框架,它主要用来处理身份认证,授权,企业会话管理和加密。

shiro功能:用户验证、用户执行访问权限控制、在任何环境下使用session API,如cs程序。可以使用多数据源如同时使用oracle、mysql。单点登录(sso)支持。remember me服务。详细介绍还请看官网的使用手册:/

与spring security区别,个人觉得二者的主要区别是:

1、shiro灵活性强,易学易扩展。同时,不仅可以在web中使用,可以工作在任务环境内中。

2、acegi灵活性较差,比较难懂,同时与spring整合性好。

如果对权限要求比较高的项目,个人建议使用shiro,主要原因是可以很容易按业务需求进行扩展。

附件是对与shiro集成的jar整合及源码。

二、shiro与spring集成

shiro默认的配置,主要是加载ini文件进行初始化工作,具体配置,还请看官网的使用手册(/)init文件不支持与spring的集成。此处主要是如何与spring及springmvc集成。

1、中配置shiro过滤器,中的配置类使用了spring的过滤代理类来完成。

Xml代码

1.

2. shiroFilter

3.

4. tingFilterProxy

5.

6.

7.

8. shiroFilter

9. /*

10.

2、在spring中的文件中添加shiro配置:

Xml代码

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18. /login/logoutlogout=logout

19. /login/**=anon

20. /**=authc,rest

21.

22.

23.

24.

25.

26.

27.

配置说明:

securityManager是shiro的核心,初始化时协调各个模块运行。

realm是shiro的桥梁,进行数据源配置,shrio提供了常用的realm数据源配置,如LDAP的JndiLdapRealm,JDBC的JdbcRealm,ini文件的IniRealm,properties文件的PropertiesRealm等,也可以插入自己的 Realm实现来代表自定义的数据源。此处使用了自定义的leopardRealm进行配置,java代码如下:

Java代码

1. public class LeopardRealm extends AuthorizingRealm {

2. /**

3. * 授权方法,在配有缓存的情况下,只加载一次。

4. */

5. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

6. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

7. //获取用户信息的所有资料,如权限角色等.

8. //ingPermissions(权限集合);

9. //es(角色集合);

10. return info;

11. }

12. /**

13. * 登陆认证

14. */

15. @Override

16. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)

17. throws AuthenticationException {

18. UsernamePasswordToken usernamePasswordToke = (UsernamePasswordToken)token;

19. String username = rname();

20. return new SimpleAuthenticationInfo(new ShiroUser("admin", "admin"), "admin",

21. ("admin"), getName());

22.

23. }

24. }

shiroFilter:shiro的权限过滤器配置,可自定义过滤器并关联至filterChainDefinitions中。shiro过滤器说明:

shiro过滤器对应的类:

过滤器名称 对应的java类

anon

authc

authcBasic

logout

ionCreatition onFilterperms

port

rest

roles

ssl

user

lter

anon:例子/admins/**=anon 没有参数,表示可以匿名使用。

authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数。

authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证。

roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。

port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。

ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https

user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

注:这些过滤器中anon,authcBasic,auchc,user是认证过滤器,perms,roles,ssl,rest,port是授权过滤器

至此配置工作已完成。

简单登录操作:

代码

Jsp代码

1. <%@ page language="java" pageEncoding="UTF-8"%>

2.

3.

4.

5. 用户名:

6. 密码:

7. 记住我:

8.

9.

10.

11.

springMVC控制层代码:

Java代码

1. import rvletRequest;

2. import rvletResponse;

3. import tyUtils;

4. import ticationException;

5. import ectCredentialsException;

6. import nAccountException;

7. import mePasswordToken;

8. import t;

9. import ller;

10. import tMapping;

11. import ndView;

12. @Controller("loginAction")

13. @RequestMapping("/login")

14. public class LoginAction {

15. @RequestMapping("")

16. //登录

17. public ModelAndView execute(HttpServletRequest request,

18. HttpServletResponse response,String username,String password) {

19. UsernamePasswordToken token = new UsernamePasswordToken(username,password);

20. //记录该令牌

21. emberMe(false);

22. //subject权限对象

23. Subject subject = ject();

24. try {

25. (token);

26. } catch (UnknownAccountException ex) {//用户名没有找到

27. tackTrace();

28. } catch (IncorrectCredentialsException ex) {//用户名密码不匹配

29. tackTrace();

30. }catch (AuthenticationException e) {//其他的登录错误

31. tackTrace();

32. }

33.

34. //验证是否成功登录的方法

35. if (enticated()) {

36. return new ModelAndView("/main/");

37. }

38. return new ModelAndView("/login/");

39. }

40.

41. //退出

42. @RequestMapping("/logout")

43. public void logout() {

44. Subject subject = ject();

45. ();

46. }

47. }

最后启动服务登录,实验证明,失败返回登录页,成功进入主页。


本文标签: 配置 登录 使用 参数 用户